舉例場景
例子:
- 重慶售票窗、上海售票窗都在賣一趟飛機票
- 問題,出現兩個售票窗同一時刻賣一張票
- 這肯定是不合理,下面說解決方式
解決方式
線程鎖,我們專業點,嗯線程同步
GCD Semaphore (信號量)
示例代碼
//"最後一張票,不騙你"
__block NSInteger planeTicketCount = 1;
// 創建線程鎖 信號=1
dispatch_semaphore_t semaphore = hSemaphore(1);
while (1) {
if (planeTicketCount == 0) break;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
// 信號遞減 == 0 就上鎖 線程一直在這裏等待 ,後面一個參數是等待時間
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
if (planeTicketCount > 0) {
// 賣掉了
planeTicketCount --;
}
// 信號遞增 不等0 則喚醒還在等待此信號的線程
dispatch_semaphore_signal(semaphore);
});
}
NSLock (鎖)
//"最後一張票,不騙你"
__block NSInteger planeTicketCount = 1;
// 買了一把鎖
NSLock *Lock = [[NSLock alloc]init];
while (1) {
if (planeTicketCount == 0)break;
[[hGCD globalQueue]queueBlock:^{
// 鎖上,不讓其他線程過去了
[Lock lock];
if (planeTicketCount >0 ) {
planeTicketCount --;
}
// 解鎖,其他線程可以進入此代碼段了
[Lock unlock];
}];
}
@synchronized (self) 顧名思義同步
//"最後一張票,不騙你"
__block NSInteger planeTicketCount = 1;
while (1) {
if (planeTicketCount == 0)break;
[[hGCD globalQueue]queueBlock:^{
// 括起來的這一段代碼 同一時間只能有一個線程執行
@synchronized (self) {
if (planeTicketCount >0 ) {
planeTicketCount --;
}
//代碼端執行完了,自動放鎖
}
}];
}