前言
這里的話我假設自己開了一家餐廳,然后座位為15個,支持網絡預訂座位,接單為兩天電腦。
我和我老婆專門為接單員,有可能會接到同一單,然后為兩個不同人同時預定一個位置,這里我們就得用到互斥鎖了
擼碼
- 代碼
@interface ViewController ()
//座位
@property(nonatomic,assign) int seat;
@end
@implementation ViewController
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// 座位一共15個
self.seat = 15;
// 開啟一個線程 也就是我老婆
NSThread *thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(ReserveSeat) object:nil];
thread1.name = @"老婆";
[thread1 start];
// 開啟一個線程 也就是我自己
NSThread *thread2 = [[NSThread alloc]initWithTarget:self selector:@selector(ReserveSeat) object:nil];
thread2.name = @"自己";
[thread2 start];
}
/**
* 開線程
*/
-(void)ReserveSeat{
// 我們必須座位預定完 也就是一直循環 直到seat屬性沒有值
while (true) {
// 判斷如果座位大于0 客戶就可以預訂
if(self.seat > 0)
{
NSLog(@"預定%d號座位 ------%@",self.seat,[NSThread currentThread]);
self.seat --;
}else{
NSLog(@"沒有座位了 ------%@",[NSThread currentThread]);
break;
}
}
}
@end
-
結果
針對上面的話 那我們只能想出一個方法 就是當我在給客人預訂的時候 我老婆是不能操作這個座位的 除非那個客戶不要了 我不操作那個座位了 ,我老婆才能去操作 那么就引出了互斥鎖這個東西 我操作的時候就鎖著它
- 代碼
/**
* 開線程
*/
-(void)ReserveSeat{
// 我們必須座位預定完 也就是一直循環 直到seat屬性沒有值
while (true) {
// 注意,鎖一定要是所有線程共享的對象
// 如果代碼中只有一個地方需要加鎖,大多都使用 self
@synchronized(self) {
// 判斷如果座位大于0 客戶就可以預訂
if(self.seat > 0)
{
NSLog(@"預定%d號座位 ------%@",self.seat,[NSThread currentThread]);
self.seat --;
}else{
NSLog(@"沒有座位了 ------%@",[NSThread currentThread]);
break;
}
}
}
}
- 結果
- 擴展
互斥鎖小結
objc 保證鎖內的代碼,同一時間,只有一條線程能夠執行! 互斥鎖的鎖定范圍,應該盡量小,鎖定范圍越大,效率越差! 速記技巧 [[NSUserDefaults standardUserDefaults] synchronize];
互斥鎖參數
能夠加鎖的任意 NSObject 對象
注意:鎖對象一定要保證所有的線程都能夠訪問
如果代碼中只有一個地方需要加鎖,大多都使用 self,這樣可以避免單獨再創建一個鎖對象
結束
本章到此結束
歡迎各位碼友隨意轉載并指正