ios 多執行緒之四 執行緒鎖

2021-07-31 23:45:34 字數 2931 閱讀 2923

假如我們在功能的實現過程中,類中有乙個全域性變數,我們建立了多個執行緒去同時改變或者使用這個變數,會出現什麼問題?

執行緒鎖就是用來解決多執行緒之間對資源共享的問題;

在上文《多執行緒之三》的基礎之上進行演示,模仿多個地點進行售票的案例。

1:建立按鈕

//問題 : 當多個執行緒執行某一塊相同**,需要執行緒鎖進行保護

uibutton *btn3 = [uibutton buttonwithtype:uibuttontypecustom];

btn3.frame = cgrectmake(40, 200, 100, 40);

[btn3 settitle:@"執行緒鎖" forstate:uicontrolstatenormal];

[btn3 setbackgroundcolor:[uicolor bluecolor]];

[btn3 addtarget:self action:@selector(click_lock) forcontrolevents:uicontroleventtouchupinside];

[self.view addsubview:btn3];

2:建立售票的管理物件

ticketmanager.h

@inte***ce ticketmanager : nsobject

- (void) startsale ;

@end

ticketmanager.m

首先做乙個擴充套件

\#define total 100   //一共一百張票

@inte***ce ticketmanager ()

@property (nonatomic, assign) int whole; //總票數

@property (nonatomic, assign) int surplus; //剩餘票數

@property (nonatomic, strong) nsthread *thread_sh; //子執行緒, 上海售票點

@property (nonatomic, strong) nsthread *thread_bj; //子執行緒, 北京售票點

@property (nonatomic, strong) nsthread *thread_sz; //子執行緒, 深圳售票點

@end

初始化售賣點

@implementation ticketmanager

- (instancetype)init

return self;

}

實現售賣方法

//售票方法

- (void) sale

}}三個地方開始同時售票

//開始賣票

- (void) startsale

3:在 viewcontroller 裡面建立和使用ticketmananger

@property (nonatomic, strong) ticketmanager *ticketmanager; //票務管理
在 viewdidload 中初始化

self.ticketmanager = [[ticketmanager alloc] init];
在 click_lock 中啟動賣票

nslog(@"開始賣票");

[self.ticketmanager startsale];

4:開始執行,檢視列印結果

根據日誌分析:非常明顯剩餘票數不正確。

接下來我們引入鎖的概念來解決這個問題。簡單說明下鎖是什麼概念呢?咱們可以先這樣理解:當我在獨自使用乙個房間的時候,不希望別人同時使用和打擾,這樣呢,我們也就可以先對該房間加上鎖,然後再使用,在使用完成之後,該房間不歸我使用了,我就解開鎖,以方便其他人使用、

執行緒鎖有三種方式:

1 : @synchronized

使用方法:將要保護起來的**塊新增到 @synchronized 的括號中包裹起來

//執行緒鎖的第一種方式 :@synchronized

@synchronized (self)

}

2:nscondition

使用方法:建立了 nscondition 物件,將保護起來的**塊使用 lock 和 unlock 進行前後包裹;

//執行緒鎖的第二種方式:nscondition

if (!self.condition)

[self.condition lock];

if (self.surplus > 0)

[self.condition unlock];

3:nslock

使用方法:建立了 nslock 物件,將保護起來的**塊使用 lock 和 unlock 進行前後包裹;

//執行緒鎖的第三種方式:nslock

if (!self.lock)

[self.lock lock];

if (self.surplus > 0)

[self.lock unlock];

在我們使用了以上三種執行緒鎖之後的列印結果是怎麼樣的呢?

可以看出列印的結果是健康和良性的;

至此,執行緒鎖的使用先告一段落,我會再後期詳細給出三種執行緒鎖的詳細特性和使用場景。敬請期待 ~~~~

多執行緒之鎖機制

多執行緒實現方式的其中之一是實現runnable方式,並且重寫run方法 package thrad author 子曰無衣 public class mythread implements runnable public mythread string name override public s...

多執行緒之互斥鎖

當執行緒之間需要用到共同的變數時,不希望某乙個執行緒使用時,被其它執行緒給呼叫,就需要互斥鎖來保證共享資源該執行緒使用完後,再給其它執行緒使用 典型例子 由於執行緒是獲取到作業系統分配的cpu時間片是才會執行,所以單cpu的情況下,多執行緒同步其實並非同步,當其中乙個執行緒1執行的時候,可能會中途跳...

多執行緒之讀寫鎖

之前沒真正使用讀寫鎖,看到別人對讀寫鎖的解釋總感覺一頭霧水。今天親自敲 實驗之後,才明了,原來如此。網上沒有一篇文章是能描述出自己理解的樣子,所以將自己的思路記下來。先提出疑問,邊自答邊找思路,有了思路,再回頭去執行一下 就清晰明了了。如果你急著想要一句話概括讀寫鎖,那我會告訴你 讀鎖是加在讀方法裡...