假如我們在功能的實現過程中,類中有乙個全域性變數,我們建立了多個執行緒去同時改變或者使用這個變數,會出現什麼問題?
執行緒鎖就是用來解決多執行緒之間對資源共享的問題;
在上文《多執行緒之三》的基礎之上進行演示,模仿多個地點進行售票的案例。
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執行的時候,可能會中途跳...
多執行緒之讀寫鎖
之前沒真正使用讀寫鎖,看到別人對讀寫鎖的解釋總感覺一頭霧水。今天親自敲 實驗之後,才明了,原來如此。網上沒有一篇文章是能描述出自己理解的樣子,所以將自己的思路記下來。先提出疑問,邊自答邊找思路,有了思路,再回頭去執行一下 就清晰明了了。如果你急著想要一句話概括讀寫鎖,那我會告訴你 讀鎖是加在讀方法裡...