#import "ViewController.h" @interface ViewController () { NSInteger _cnt; NSLock *_lock; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //必須先建立鎖 _lock = [[NSLock alloc] init]; [NSThread detachNewThreadSelector:@selector(thread1Click) toTarget:self withObject:nil]; [NSThread detachNewThreadSelector:@selector(thread2Click) toTarget:self withObject:nil]; } /* 下面兩個線程 執行的函數 共同操做同一個資源變量 若是咱們不作任何處理 那麼兩個線程就會爭搶資源,這樣就達不到咱們想要的效果,數據有可能致使比較混亂 //若是兩個線程要操做同一個資源,那麼咱們通常要進行加鎖保護,當訪問資源的時候進行加鎖,訪問結束 解鎖 */ #pragma mark - 子線中調用的函數 //線程1想作 兩次執行 之間 間隔10 - (void)thread1Click{ NSLog(@"線程1開始"); //加鎖 /* 一旦線程 執行 [_lock lock],先檢測一下 有沒有加鎖,若是加鎖那麼當前線程就會阻塞 直到 這個鎖解鎖以後 才能繼續執行,若是 鎖 沒有鎖着,當即加上鎖鎖住繼續執行下面的代碼 同一個資源多個線程必須是同一把鎖 //加鎖的話要注意防止死鎖 */ [_lock lock]; for (NSInteger i = 0; i < 10; i++) { _cnt += 10; NSLog(@"%s_cnt:%ld",__func__,_cnt); [NSThread sleepForTimeInterval:0.5]; } [_lock unlock]; NSLog(@"線程1即將結束"); } //線程2想要的現象是 每次間隔2 - (void)thread2Click{ NSLog(@"線程2開始"); [_lock lock]; for (NSInteger i = 0; i < 10; i++) { _cnt -= 2; NSLog(@"%s_cnt:%ld",__func__,_cnt); [NSThread sleepForTimeInterval:0.5]; } [_lock unlock]; NSLog(@"線程2即將結束"); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end