iOS多線程開發(fā)-線程安全

說到多線程就不得不提多線程中的鎖機(jī)制,多線程操作過程中往往多個(gè)線程是并發(fā)執(zhí)行的,同一個(gè)資源可能被多個(gè)線程同時(shí)訪問,造成資源搶奪,這個(gè)過程中如果沒有鎖機(jī)制往往會(huì)造成重大問題。舉例來說,每年春節(jié)都是一票難求,在12306買票的過程中,成百上千的票瞬間就消失了。不妨假設(shè)某輛車有1千張票,同時(shí)有幾萬人在搶這列車的車票,順利的話前面的人都能買到票。但是如果現(xiàn)在只剩下一張票了,而同時(shí)還有幾千人在購買這張票,雖然在進(jìn)入購票環(huán)節(jié)的時(shí)候會(huì)判斷當(dāng)前票數(shù),但是當(dāng)前已經(jīng)有100個(gè)線程進(jìn)入購票的環(huán)節(jié),每個(gè)線程處理完票數(shù)都會(huì)減1,100個(gè)線程執(zhí)行完當(dāng)前票數(shù)為-99,遇到這種情況很明顯是不允許的。

要解決資源搶奪問題在iOS中有常用的有兩種方法:一種是使用NSLock同步鎖,另一種是使用@synchronized代碼塊。兩種方法實(shí)現(xiàn)原理是類似的,只是在處理上代碼塊使用起來更加簡(jiǎn)單(C#中也有類似的處理機(jī)制synchronized和lock)。

多線程的安全隱患

資源共享

一塊資源可能會(huì)被多個(gè)線程共享,也就是多個(gè)線程可能會(huì)訪問同一塊資源。比如多個(gè)線程訪問同一個(gè)對(duì)象、同一個(gè)變量、同一個(gè)文件。當(dāng)多個(gè)線程訪問同一塊資源時(shí),很容易引發(fā)數(shù)據(jù)錯(cuò)亂和數(shù)據(jù)安全問題。

  • (void)test
    {
    //默認(rèn)有20張票
    leftTicketsCount = 10;

    //開啟多個(gè)線程,模擬售票員售票
    NSThread *thread1=[[NSThread alloc]initWithTarget:self selector:@selector(sellTickets) object:nil];
    thread1.name=@"售票員A";

    NSThread *thread2=[[NSThread alloc]initWithTarget:self selector:@selector(sellTickets) object:nil];
    thread2.name=@"售票員B";

    NSThread *thread3=[[NSThread alloc]initWithTarget:self selector:@selector(sellTickets) object:nil];
    thread3.name=@"售票員C";

    //開啟線程

    [thread1 start];
    [thread2 start];
    [thread3 start];
    }

  • (void)sellTickets
    {
    while (1) {
    //1.先檢查票數(shù)
    int count = leftTicketsCount;
    if (count>0) {
    //暫停一段時(shí)間
    [NSThread sleepForTimeInterval:0.002];

          //2.票數(shù)-1
          leftTicketsCount= count-1;
          
          //獲取當(dāng)前線程
          NSThread *current=[NSThread currentThread];
          NSLog(@"%@--賣了一張票,還剩余%d張票", current.name, leftTicketsCount);
      }
      else {
          //退出線程
          [NSThread exit];
      }
    

    }
    }
    </code></pre>

打印結(jié)果:

售票結(jié)果,出現(xiàn)了重復(fù)買票的現(xiàn)象

如何解決

1.使用互斥鎖

格式:

@synchronized(鎖對(duì)象) {
// 需要鎖定的代碼
}

注意:鎖定1份代碼只用1把鎖,用多把鎖是無效的

<pre><code>

  • (void)sellTickets
    {
    while (1) {
    @synchronized(self){//加一把鎖
    //1.先檢查票數(shù)
    int count = leftTicketsCount;
    if (count>0) {
    //暫停一段時(shí)間
    [NSThread sleepForTimeInterval:0.002];

              //2.票數(shù)-1
              leftTicketsCount= count-1;
              
              //獲取當(dāng)前線程
              NSThread *current=[NSThread currentThread];
              NSLog(@"%@--賣了一張票,還剩余%d張票", current.name, leftTicketsCount);
          }
          else {
              //退出線程
              [NSThread exit];
          }
      }
    

    }
    }
    </code></pre>

打印結(jié)果:

Paste_Image.png

互斥鎖的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):能有效防止因多線程搶奪資源造成的數(shù)據(jù)安全問題
缺點(diǎn):需要消耗大量的CPU資源

互斥鎖的使用前提:多條線程搶奪同一塊資源
相關(guān)專業(yè)術(shù)語:線程同步,多條線程按順序地執(zhí)行任務(wù)
互斥鎖,就是使用了線程同步技術(shù)

2.原子和非原子屬性

OC在定義屬性時(shí)有nonatomic和atomic兩種選擇
atomic:原子屬性,為setter方法加鎖(默認(rèn)就是atomic)
nonatomic:非原子屬性,不會(huì)為setter方法加鎖

atomic加鎖原理:
<pre><code>
@property (assign, atomic) int age;

  • (void)setAge:(int)age
    {
    @synchronized(self) {
    _age = age;
    }
    }
    </code></pre>

nonatomic和atomic對(duì)比

  • atomic:線程安全,需要消耗大量的資源
  • nonatomic:非線程安全,適合內(nèi)存小的移動(dòng)設(shè)備

3.NSLock

NSLock使用效果

4.dispatch_semaphore

dispatch_semaphore使用效果

# 深入理解 iOS 開發(fā)中的鎖

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 引言 說到多線程就不得不提多線程中的鎖機(jī)制,多線程操作過程中往往都是多個(gè)線程并發(fā)執(zhí)行的,因此同一個(gè)資源可能被多個(gè)線...
    奮斗的郅博閱讀 412評(píng)論 0 4
  • 一、多線程基礎(chǔ) 基本概念 進(jìn)程進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專用且...
    AlanGe閱讀 656評(píng)論 0 0
  • 【暫時(shí)先不處理】線程安全是什么意思?線程安全和鎖機(jī)制有關(guān), NSRunloop 提供的API是不安全的。 要解決資...
    helinyu閱讀 195評(píng)論 0 1
  • 線程概述 有些程序是一條直線,起點(diǎn)到終點(diǎn);有些程序是一個(gè)圓,不斷循環(huán),直到將它切斷一個(gè)運(yùn)行著的程序就是一個(gè)進(jìn)程或者...
    褪而未變閱讀 362評(píng)論 0 0
  • 一一喜迎十九大 做優(yōu)秀教師 滑縣向陽小學(xué) 何淑利 ...
    茶色暖陽閱讀 504評(píng)論 0 0

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