GCD多線程同步實(shí)現(xiàn)鎖效果

多線程同步菩掏?這個(gè)有什么意義呢魂角。
多線程編程里面,一些敏感數(shù)據(jù)不允許被多個(gè)線程同時(shí)訪問智绸,此時(shí)就使用同步訪問技術(shù)野揪,保證數(shù)據(jù)在任何時(shí)刻,最多有一個(gè)線程訪問瞧栗,以保證數(shù)據(jù)的完整性斯稳。
先來個(gè)概念性的東西,理解下

信號(hào)量

信號(hào)量(Semaphore)迹恐,有時(shí)被稱為信號(hào)燈挣惰,是在多線程環(huán)境下使用的一種設(shè)施,是可以用來保證兩個(gè)或多個(gè)關(guān)鍵代碼段不被并發(fā)調(diào)用。在進(jìn)入一個(gè)關(guān)鍵代碼段之前憎茂,線程必須獲取一個(gè)信號(hào)量珍语;一旦該關(guān)鍵代碼段完成了,那么該線程必須釋放信號(hào)量竖幔。其它想進(jìn)入該關(guān)鍵代碼段的線程必須等待直到第一個(gè)線程釋放信號(hào)量板乙。為了完成這個(gè)過程,需要?jiǎng)?chuàng)建一個(gè)信號(hào)量VI赏枚,然后將Acquire Semaphore VI以及Release Semaphore VI分別放置在每個(gè)關(guān)鍵代碼段的首末端亡驰。確認(rèn)這些信號(hào)量VI引用的是初始創(chuàng)建的信號(hào)量。

可以簡(jiǎn)單理解成線程同步作用和加鎖相似饿幅。其實(shí)同步和加鎖是有區(qū)別的。只是線程同步的效果和加鎖之后的作用一樣戒职。具體下一篇會(huì)有解釋栗恩。不廢話了,直奔代碼

先模擬用戶去買票洪燥,一共提供三條通道磕秤,買票。

沒有進(jìn)行線程同步
線程沒有同步

上述是開啟三條線程捧韵,然后都是同時(shí)去對(duì)數(shù)據(jù)進(jìn)行減減操作市咆。會(huì)發(fā)現(xiàn),數(shù)據(jù)出現(xiàn)異常再来。那是因?yàn)槊衫迹鄺l線程同時(shí)訪問這個(gè)數(shù)據(jù)時(shí)候,該線程只是讀取到他訪問時(shí)候的數(shù)據(jù)芒篷,若此時(shí)還有其他線程對(duì)該數(shù)據(jù)進(jìn)行操作的話搜变。則這個(gè)數(shù)據(jù)就會(huì)出現(xiàn)異常。

一:GCD中的信號(hào)量實(shí)現(xiàn)線程同步
- (void)viewDidLoad {
    [super viewDidLoad];
   
    // 實(shí)例類person
    self.person = [[Person alloc] init];
    self.person.num = 100;
    
    
    //dispatch_semaphore_create(1) 創(chuàng)建一個(gè)信號(hào)量针炉,設(shè)置信號(hào)量的資源數(shù)0表示沒有資源挠他,調(diào)用dispatch_semaphore_wait會(huì)立即等待。
    //dispatch_semaphore_signal  發(fā)送一個(gè)信號(hào)會(huì)讓信號(hào)量+1
    //dispatch_semaphore_wait  等待信號(hào)會(huì)讓信號(hào)量 —1
    self.semaphore = dispatch_semaphore_create(1);
    
    //模擬三條不同的網(wǎng)絡(luò)去搶票
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeActionA) userInfo:nil repeats:YES];
    [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(timeActionB) userInfo:nil repeats:YES];
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeActionC) userInfo:nil repeats:YES];
    
}

- (void)timeActionA{
       // 線程A
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //等待信號(hào)篡帕,當(dāng)信號(hào)總量少于0的時(shí)候就會(huì)一直等待殖侵,否則就可以正常的執(zhí)行,并讓信號(hào)總量-1
        dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
        [self.person personA];
        //發(fā)送一個(gè)信號(hào)镰烧,自然會(huì)讓信號(hào)總量加1拢军,
        dispatch_semaphore_signal(self.semaphore); 
    });   
}
- (void)timeActionB{    
    // 線程A
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
        [self.person personB];
        dispatch_semaphore_signal(self.semaphore);
    });   
}
- (void)timeActionC{   
    // 線程A
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
        [self.person personC];
        dispatch_semaphore_signal(self.semaphore);
    });
}

Person類的實(shí)現(xiàn)。

-(void)personA{
    self.num--;
    NSLog(@"A票通道  剩余總票:%ld",(long)self.num);}
-(void)personB{
    self.num--;
    NSLog(@"B票通道  剩余總票:%ld",(long)self.num);
}

-(void)personC{
    self.num--;
    NSLog(@"C票通道  剩余總票:%ld",(long)self.num);   
}
模擬搶票Log
一:GCD分組實(shí)現(xiàn)線程同步
- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 實(shí)例類person
    self.person = [[Person alloc] init];
    self.person.num = 100;
    
    //創(chuàng)建隊(duì)列組隊(duì)
    self.group = dispatch_group_create();
    
    
    //模擬三條不同的網(wǎng)絡(luò)去搶票
    [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(timeActionA) userInfo:nil repeats:YES];
    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timeActionB) userInfo:nil repeats:YES];
    [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(timeActionC) userInfo:nil repeats:YES];

    
}

- (void)timeActionA{
    
    //進(jìn)入組
    dispatch_group_enter(self.group);
    //線程放進(jìn)隊(duì)列組
    dispatch_group_async(self.group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self.person personA];
        //離開組
        dispatch_group_leave(self.group);
    });
}

- (void)timeActionB{    

    //進(jìn)入組
    dispatch_group_enter(self.group);
    
    dispatch_group_async(self.group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        [self.person personB];
        dispatch_group_leave(self.group);
        
    });

}

- (void)timeActionC{
    //進(jìn)入組
    dispatch_group_enter(self.group);
    
    dispatch_group_async(self.group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        [self.person personC];
        dispatch_group_leave(self.group); 
    });
}
線程組模擬線程同步
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拌滋,一起剝皮案震驚了整個(gè)濱河市朴沿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖赌渣,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魏铅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡坚芜,警方通過查閱死者的電腦和手機(jī)览芳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸿竖,“玉大人沧竟,你說我怎么就攤上這事「坑牵” “怎么了悟泵?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闪水。 經(jīng)常有香客問我糕非,道長,這世上最難降的妖魔是什么球榆? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任朽肥,我火速辦了婚禮,結(jié)果婚禮上持钉,老公的妹妹穿的比我還像新娘衡招。我一直安慰自己,他們只是感情好每强,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布始腾。 她就那樣靜靜地躺著,像睡著了一般舀射。 火紅的嫁衣襯著肌膚如雪窘茁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天脆烟,我揣著相機(jī)與錄音山林,去河邊找鬼。 笑死邢羔,一個(gè)胖子當(dāng)著我的面吹牛驼抹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拜鹤,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼框冀,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了敏簿?” 一聲冷哼從身側(cè)響起明也,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤宣虾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后温数,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绣硝,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年撑刺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹉胖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡够傍,死狀恐怖甫菠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冕屯,我是刑警寧澤寂诱,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站安聘,受9級(jí)特大地震影響刹衫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搞挣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望音羞。 院中可真熱鬧囱桨,春花似錦、人聲如沸嗅绰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窘面。三九已至翠语,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間财边,已是汗流浹背肌括。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酣难,地道東北人谍夭。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像憨募,于是被迫代替她去往敵國和親紧索。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容