NSLock線程鎖??

顧名思義弓候,就是對(duì)一個(gè)線程加個(gè)鎖??郎哭。具體怎么辦,看代碼菇存。
用起來很簡(jiǎn)單夸研。


bbbbb.gif

如果對(duì)一個(gè)數(shù)據(jù)在多個(gè)線程中都有對(duì)它的操作,可能會(huì)造成意向不到的結(jié)果亥至。
如下代碼抬闯,我在兩個(gè)線程對(duì)同一個(gè)數(shù)組進(jìn)行刪除元素溶握。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    
    self.dataArr = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", nil];
    dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(quene, ^{
        for (int i = 0; i < 8; i++) {
            [self deleteObj];
        }
    });
    
    dispatch_async(quene, ^{
        for (int i = 0; i < 8; i++) {
            [self deleteObj];
        }
    });
}

- (void)deleteObj {
    
    if (self.dataArr.count > 0) {
        
        NSString *obj = [self.dataArr lastObject];
        NSLog(@"666_SunDePrint_999:刪除了%@", obj);
        [self.dataArr removeLastObject];
    }else{
        NSLog(@"666_SunDePrint_999:%@", @"已經(jīng)刪除完了");
    }
}

結(jié)果:


沒加線程鎖的結(jié)果.png

很明顯看到萍肆,第6個(gè)元素竟然刪除了2遍U陀臁!感覺這是不應(yīng)該發(fā)生的亲铡,但是它確實(shí)發(fā)生了葡兑。怎么辦吆鹤?當(dāng)然是加線程鎖了疑务。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //初始化一個(gè)NSLock
    self.lock = [[NSLock alloc] init];
    self.dataArr = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", nil];
    dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(quene, ^{
        for (int i = 0; i < 8; i++) {
            [self deleteObj];
        }
    });
    
    dispatch_async(quene, ^{
        for (int i = 0; i < 8; i++) {
            [self deleteObj];
        }
    });
}

- (void)deleteObj {
    
    [self.lock lock];
    if (self.dataArr.count > 0) {
        NSString *obj = [self.dataArr lastObject];
        NSLog(@"666_SunDePrint_999:刪除了%@", obj);
        [self.dataArr removeLastObject];
    }else{
        NSLog(@"666_SunDePrint_999:%@", @"已經(jīng)刪除完了");
    }
    [self.lock unlock];
}

通過一個(gè)NSLock,在對(duì)數(shù)組操作前先加把鎖婴削,不讓別的線程訪問廊镜,操作完后就unlock解鎖。

加完鎖??的結(jié)果.png

二衡楞、@synchronized
除了NSLock當(dāng)做線程鎖,@synchronized也可以迷守。通過保護(hù)一個(gè)對(duì)象,一般是self茵瘾,就保護(hù)了這個(gè)對(duì)象的數(shù)據(jù)祈惶。

- (void)deleteObj {
    
    @synchronized(self){
        
        if (self.dataArr.count > 0) {
            NSString *obj = [self.dataArr lastObject];
            NSLog(@"666_SunDePrint_999:刪除了%@", obj);
            [self.dataArr removeLastObject];
            
        }else{
            NSLog(@"666_SunDePrint_999:%@", @"已經(jīng)刪除完了");
        }
    }
}

效果和NSLock一樣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末血久,一起剝皮案震驚了整個(gè)濱河市末盔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖谜慌,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異莺奔,居然都是意外死亡欣范,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門令哟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恼琼,“玉大人,你說我怎么就攤上這事屏富∏缇海” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵役听,是天一觀的道長(zhǎng)颓鲜。 經(jīng)常有香客問我表窘,道長(zhǎng),這世上最難降的妖魔是什么甜滨? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任乐严,我火速辦了婚禮,結(jié)果婚禮上衣摩,老公的妹妹穿的比我還像新娘昂验。我一直安慰自己,他們只是感情好艾扮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布既琴。 她就那樣靜靜地躺著,像睡著了一般泡嘴。 火紅的嫁衣襯著肌膚如雪甫恩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天酌予,我揣著相機(jī)與錄音磺箕,去河邊找鬼。 笑死抛虫,一個(gè)胖子當(dāng)著我的面吹牛松靡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播建椰,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼雕欺,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了棉姐?” 一聲冷哼從身側(cè)響起屠列,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谅海,沒想到半個(gè)月后脸哀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扭吁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年撞蜂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侥袜。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝌诡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出枫吧,到底是詐尸還是另有隱情浦旱,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布九杂,位于F島的核電站颁湖,受9級(jí)特大地震影響宣蠕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甥捺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一抢蚀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镰禾,春花似錦皿曲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至备韧,卻和暖如春劫樟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背织堂。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工毅哗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捧挺。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像尿瞭,于是被迫代替她去往敵國(guó)和親闽烙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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