iOS鎖

NSLock

  nslock是互斥鎖,非遞歸所,連續(xù)加鎖大于等于兩次[self.lock lock]會(huì)造成死鎖

@synchronized

  @synchronized 互斥鎖(當(dāng)中的遞歸鎖)跟(NSLock, 更準(zhǔn)確的說(shuō)法應(yīng)該是遞歸鎖NSRecursiveLock)類似:它可以防止不同的線程同時(shí)執(zhí)行同一段代碼。但在某些情況下,相比于使用 NSLock 創(chuàng)建鎖對(duì)象、加鎖和解鎖來(lái)說(shuō),@synchronized 用著更方便,可讀性更高, 自然效率會(huì)比較低。
只有一個(gè)線程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    @synchronized(self) {
        sleep(2);
        NSLog(@"線程1");
      }
      sleep(1);
      NSLog(@"線程1解鎖成功");
  });

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      @synchronized(self) {
          NSLog(@"線程2");
      }
 });
 打印    線程1---->線程2----->線程1解鎖成功
  @synchronized(object) 指令使用的 object 為該鎖的唯一標(biāo)識(shí),只有當(dāng)標(biāo)識(shí)相同時(shí),才滿足互斥,所以如果線程 2 中的                   
  @synchronized(self) 改為@synchronized(self.view),則線程2就不會(huì)被阻塞
  @synchronized 指令實(shí)現(xiàn)鎖的優(yōu)點(diǎn)就是我們不需要在代碼中顯式的創(chuàng)建鎖對(duì)象,便可以實(shí)現(xiàn)鎖的機(jī)制,但作為一種預(yù)防措施, 
  @synchronized 塊會(huì)隱式的添加一個(gè)異常處理例程來(lái)保護(hù)代碼,該處理例程會(huì)在異常拋出的時(shí)候自動(dòng)的釋放互斥鎖。
  如果在 @sychronized(object){} 內(nèi)部 object 被釋放或被設(shè)為 nil,從測(cè)試的結(jié)果來(lái)看,的確沒(méi)有問(wèn)題,但如果 object 一開(kāi)始就是 
  nil,則失去了鎖的功能。但 @synchronized([NSNull null]) 是完全可以的。

  遞歸鎖: 同一個(gè)線程可以重復(fù)的加鎖而不會(huì)導(dǎo)致死鎖(互斥鎖: 同一個(gè)線程重復(fù)加鎖會(huì)導(dǎo)致死鎖) ,加的遞歸鎖全部執(zhí)行完后 才會(huì)把資源讓給別的線程。不同的線程要求加鎖會(huì)陷入等待. 
  傳入的object必須是有地址的指針的,才能起到加鎖效果,如果傳入的對(duì)象釋放了nil就起不到加鎖的作用。

GCD信號(hào)量 dispatch_semaphore_create(1) 賦值為1就代表鎖

      信號(hào)量置為1 每次都只有一個(gè)線程在執(zhí)行
     dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        //任務(wù)1
     dispatch_async(queue, ^{
      dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
      NSLog(@"run task 1");
      sleep(1);
      NSLog(@"complete task 1");
      dispatch_semaphore_signal(semaphore);
    });
    //任務(wù)2
    dispatch_async(queue, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"run task 2");
        sleep(1);
        NSLog(@"complete task 2");
        dispatch_semaphore_signal(semaphore);
    });
    //任務(wù)3
    dispatch_async(queue, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"run task 3");
        sleep(1);
        NSLog(@"complete task 3");
        dispatch_semaphore_signal(semaphore);
    });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這段時(shí)間的研究?jī)?nèi)容的是鎖,因?yàn)閷?shí)際開(kāi)發(fā)中用到的比較少,文中難免會(huì)有錯(cuò)誤,希望能夠多多指正。這篇博客的第一部分是一些...
    kikido閱讀 560評(píng)論 0 1
  • 本文為L(zhǎng)_Ares個(gè)人寫(xiě)作,以任何形式轉(zhuǎn)載請(qǐng)表明原文出處。 鎖,在多線程的編程中,經(jīng)常出場(chǎng)的人物,本文只是自己對(duì)鎖...
    L_Ares閱讀 945評(píng)論 0 2
  • 各種鎖的性能較 鎖是用來(lái)保證線程安全的一種機(jī)制,也是保持?jǐn)?shù)據(jù)同步的一種必要手段。是確保一段代碼在同一個(gè)時(shí)間只能允許...
    Kk太陽(yáng)閱讀 369評(píng)論 0 2
  • 一、基本概念 ios中的鎖主要可以分為兩大類,互斥鎖 和 自旋鎖,其他鎖都是這兩種鎖的延伸和擴(kuò)展。 1、介紹 互斥...
    正_文閱讀 4,577評(píng)論 0 7
  • 轉(zhuǎn)發(fā):LockForiOS 又到了春天挪坑的季節(jié),想起多次被問(wèn)及到鎖的概念,決定好好總結(jié)一番。 翻看目前關(guān)于 iO...
    Cooci_和諧學(xué)習(xí)_不急不躁閱讀 2,356評(píng)論 1 22

友情鏈接更多精彩內(nèi)容