iOS開發(fā)多線程篇—單例對象 線程安全性保護(hù)

多線程的安全隱患

資源共享

1塊資源可能會(huì)被多個(gè)線程共享,也就是多個(gè)線程可能會(huì)訪問同一塊資源

比如多個(gè)線程訪問同一個(gè)對象、同一個(gè)變量、同一個(gè)文件

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

如何解決

使用互斥鎖

@synchronized(鎖對象) { // 需要鎖定的代碼? }

被鎖定的代碼在多線程中會(huì)順序執(zhí)行。

互斥鎖的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):能有效防止因多線程搶奪資源造成的數(shù)據(jù)安全問題

缺點(diǎn):需要消耗大量的CPU資源

互斥鎖的使用前提:多條線程搶奪同一塊資源

相關(guān)專業(yè)術(shù)語:線程同步,多條線程按順序地執(zhí)行任務(wù)

互斥鎖,就是使用了線程同步技術(shù)

使用OC原子性實(shí)現(xiàn)互斥鎖

OC在定義屬性時(shí)有nonatomic和atomic兩種選擇

atomic:原子屬性,為setter方法加鎖(默認(rèn)就是atomic)

nonatomic:非原子屬性,不會(huì)為setter方法加鎖

atomic加鎖原理

@property (assign, atomic) int age;

?- (void)setAge:(int)age

?{ ?

? ? ? ? ? @synchronized(self) {

? ? ? ? ? ? ? ? ? _age = age;

? ? ? ? ? ?}

}

總結(jié):鑒于數(shù)據(jù)安全和代碼執(zhí)行效率考慮,在共享的單例對象中,只讀的屬性建議選擇非原子性,可讀寫的屬性則必須為原子性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,902評論 0 11
  • 前言 iOS開發(fā)中由于各種第三方庫的高度封裝,對鎖的使用很少,剛好之前面試中被問到的關(guān)于并發(fā)編程鎖的問題,都是一知...
    喵渣渣閱讀 3,869評論 0 33
  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,299評論 0 14
  • Java-Review-Note——4.多線程 標(biāo)簽: JavaStudy PS:本來是分開三篇的,后來想想還是整...
    coder_pig閱讀 1,772評論 2 17
  • 再堅(jiān)持兩周就要?jiǎng)倮^關(guān)啦!堅(jiān)持,不放棄! 1.關(guān)于早睡早起:延續(xù)上周的節(jié)奏,但是在下半周因?yàn)楹⒆雍妥约荷眢w頻頻出問...
    曉棟Mona閱讀 175評論 2 1

友情鏈接更多精彩內(nèi)容