多線程-訪問公共資源引發(fā)數(shù)據(jù)安全分析

  • 共享資源:
    一塊資源可能會被多個線程共享,也就是多個線程可能會訪問同一塊資源
    比如多個線程訪問統(tǒng)一個對象年缎、同一個變量硅则、同一個文件

當(dāng)多個線程訪問同一塊資源時,很容易引發(fā)數(shù)據(jù)錯亂和數(shù)據(jù)安全問題

之所以會出現(xiàn)數(shù)據(jù)錯亂的問題,是由于CPU的工作特性,隨機(jī)在不同的線程間進(jìn)行調(diào)度.

先通過一段代碼演示多線程下訪問公共資源引發(fā)數(shù)據(jù)錯亂的情景:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController{
    
    NSInteger _totalCounts;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    _totalCounts = 10;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(demo) object:nil];
    NSThread *thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(demo) object:nil];
    
    [thread1 start];
    [thread2 start];
}

- (void)demo{
    
    for (int i = 0; i < 10 ;i ++) {
        
        if (_totalCounts > 0) {
            
            _totalCounts--;
            NSLog(@"%zd",_totalCounts);
            
        }else{
            
            NSLog(@"停止");
            break;
        }
    }
    
}

@end

這段代碼中,兩條子線程分別訪問同一個成員變量并修改該成員變量的值,這里循環(huán)的次數(shù)比較少,如果想要出現(xiàn)數(shù)據(jù)錯亂線程更明顯一些,可以將循環(huán)次數(shù)變大,排除正常結(jié)果,在出現(xiàn)數(shù)據(jù)錯亂的情景中,有兩種典型的情況:

開始時先輸出8,后輸出9

2016-07-30 22:35:26.863 多線程訪問共享資源[1580:253147] 8
2016-07-30 22:35:26.863 多線程訪問共享資源[1580:253148] 9
2016-07-30 22:35:26.863 多線程訪問共享資源[1580:253147] 7
2016-07-30 22:35:26.863 多線程訪問共享資源[1580:253148] 6
2016-07-30 22:35:26.863 多線程訪問共享資源[1580:253147] 5
2016-07-30 22:35:26.863 多線程訪問共享資源[1580:253148] 4
2016-07-30 22:35:26.864 多線程訪問共享資源[1580:253147] 3
2016-07-30 22:35:26.864 多線程訪問共享資源[1580:253148] 2
2016-07-30 22:35:26.864 多線程訪問共享資源[1580:253147] 1
2016-07-30 22:35:26.864 多線程訪問共享資源[1580:253148] 0
2016-07-30 22:35:26.864 多線程訪問共享資源[1580:253147] 停止
2016-07-30 22:35:26.864 多線程訪問共享資源[1580:253148] 停止

分析:

多線程訪問公共資源_1.png

1.假設(shè)藍(lán)色線程先被執(zhí)行,初始值10,進(jìn)入循環(huán)
2._totalCounts--; 藍(lán)色線程執(zhí)行自減,此時公共資源的值變?yōu)?
3.在執(zhí)行完自減,并在NSLog輸出前,該線程進(jìn)入阻塞狀態(tài),CPU切換到粉色線程執(zhí)行任務(wù)
4.粉色線程初始值9,進(jìn)入循環(huán)
5._totalCounts--; 粉色線程同樣執(zhí)行自減,此時公共資源的值變?yōu)?
6.粉色線程繼續(xù)執(zhí)行NSLog,輸出結(jié)果8,粉色線程進(jìn)入阻塞狀態(tài)
7.再次切換回藍(lán)色線程執(zhí)行下一句代碼NSLog,之前記錄的結(jié)果為9,所以打印結(jié)果為9

從而出現(xiàn)先打印8,后打印9的現(xiàn)象

開始時連續(xù)輸出兩個9

這種情況模擬時出現(xiàn)的概率比較低,直接分析結(jié)果:

多線程訪問公共資源_2.png

1.假設(shè)藍(lán)色線程先被執(zhí)行,初始值10,進(jìn)入循環(huán)
2.在執(zhí)行自減操作前藍(lán)色線程就進(jìn)入阻塞狀態(tài),此時公共資源的值仍為10
3.CPU切換到粉色線程執(zhí)行任務(wù),粉色線程初始值10,進(jìn)入循環(huán)
4._totalCounts--; 粉色線程執(zhí)行自減,此時公共資源的值變?yōu)?
5.粉色線程繼續(xù)執(zhí)行NSLog,輸出結(jié)果9,粉色線程進(jìn)入阻塞狀態(tài)
6.再次切換回藍(lán)色線程,根據(jù)上一次操作記錄(初始值10,滿足條件進(jìn)入循環(huán))繼續(xù)執(zhí)行任務(wù),執(zhí)行自減操作,此時totalCounts由10變?yōu)?
7.執(zhí)行NSLog,打印結(jié)果為9

從而導(dǎo)致出現(xiàn)開始連續(xù)兩次打印9 的現(xiàn)象

正因為CPU的這種工作特性,如果使用多線程,不對公共資源做處理,就會造成數(shù)據(jù)安全問題,除了上述的兩種典型情況外,還有其他情況,例如:

2016-07-30 23:16:04.960 多線程訪問共享資源[1725:297008] 8
2016-07-30 23:16:04.960 多線程訪問共享資源[1725:297009] 9
2016-07-30 23:16:04.961 多線程訪問共享資源[1725:297008] 7
2016-07-30 23:16:04.961 多線程訪問共享資源[1725:297009] 6
2016-07-30 23:16:04.961 多線程訪問共享資源[1725:297008] 5
2016-07-30 23:16:04.961 多線程訪問共享資源[1725:297009] 4
2016-07-30 23:16:04.961 多線程訪問共享資源[1725:297008] 3
2016-07-30 23:16:04.962 多線程訪問共享資源[1725:297009] 2
2016-07-30 23:16:04.962 多線程訪問共享資源[1725:297008] 1
2016-07-30 23:16:04.962 多線程訪問共享資源[1725:297008] 停止
2016-07-30 23:16:04.962 多線程訪問共享資源[1725:297009] 0
2016-07-30 23:16:04.962 多線程訪問共享資源[1725:297009] 停止
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末歪今,一起剝皮案震驚了整個濱河市萧锉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朗兵,老刑警劉巖污淋,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異余掖,居然都是意外死亡寸爆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門盐欺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赁豆,“玉大人,你說我怎么就攤上這事找田「韬” “怎么了着憨?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵墩衙,是天一觀的道長。 經(jīng)常有香客問我,道長漆改,這世上最難降的妖魔是什么心铃? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮挫剑,結(jié)果婚禮上去扣,老公的妹妹穿的比我還像新娘。我一直安慰自己樊破,他們只是感情好愉棱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哲戚,像睡著了一般奔滑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顺少,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天朋其,我揣著相機(jī)與錄音,去河邊找鬼脆炎。 笑死梅猿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秒裕。 我是一名探鬼主播袱蚓,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼几蜻!你這毒婦竟也來了癞松?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤入蛆,失蹤者是張志新(化名)和其女友劉穎响蓉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哨毁,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枫甲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扼褪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片想幻。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖话浇,靈堂內(nèi)的尸體忽然破棺而出脏毯,到底是詐尸還是另有隱情,我是刑警寧澤幔崖,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布食店,位于F島的核電站渣淤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吉嫩。R本人自食惡果不足惜价认,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望自娩。 院中可真熱鬧用踩,春花似錦、人聲如沸忙迁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姊扔。三九已至丁屎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旱眯,已是汗流浹背晨川。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留删豺,地道東北人共虑。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像呀页,于是被迫代替她去往敵國和親妈拌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

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