iOS多線程篇-NSThread-synchronized(互斥鎖)

前言

這里的話我假設自己開了一家餐廳,然后座位為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,這樣可以避免單獨再創建一個鎖對象

結束

                  本章到此結束
            歡迎各位碼友隨意轉載并指正
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容