JAVA并發(fā)編程實戰(zhàn)呻纹,第二章 線程安全性

要編寫線程安全的代碼鸽心,核心在于對狀態(tài)訪問操作進行管理,特別是共享的(Shared)和可變的(Mutable)訪問

對象的狀態(tài)指存儲在狀態(tài)變量(實例變量居暖、靜態(tài)域)中的數(shù)據(jù),對象的狀態(tài)可能包括其他依賴對象的域

共享”意味著變量可以由多個線程訪問藤肢;“可變”意味著變量的值在其聲明周期內(nèi)可以發(fā)生變化


多個線程訪問同一個可變的狀態(tài)變量沒有使用合適的同步太闺,就可能出現(xiàn)錯誤,有三種方式可以修復(fù)這個問題

a.不在線程之間共享該狀態(tài)變量

b.將該狀態(tài)變量修改為不可變的變量

c.在使用狀態(tài)變量時使用同步


2.1 什么是線程安全性

正確性:某個類的行為與其規(guī)范完全一致

當多個線程訪問某個類時嘁圈,不管運行環(huán)境采用何種調(diào)用方式或者這些線程如何交替執(zhí)行省骂,并且在主調(diào)代碼中不需要任何額外的同步或協(xié)同蟀淮,這個類都能表現(xiàn)出正確的行為,那么就稱這個類是線程安全的

無狀態(tài)類一定是線程安全的


2.2 原子性

2.2.1競態(tài)條件

由于不恰當?shù)膱?zhí)行時序而出現(xiàn)的不正確的結(jié)果的情況稱為競態(tài)條件

最常見的競態(tài)條件類型就是“先檢查后執(zhí)行(Check-then-Act)”

讀取-修改-寫入”操作也是一種競態(tài)條件


2.2.2延遲初始化中的競態(tài)條件


2.2.3復(fù)合操作

原子操作:對于訪問同一個狀態(tài)的所有操作(包括操作本身)來說钞澳,這個操作是一個以原子方式執(zhí)行的操作

復(fù)合操作:包含了一組必須以原子方式執(zhí)行的操作以保證線程安全性


當在無狀態(tài)的類中加入一個狀態(tài)時怠惶,如果該狀態(tài)完全由線程安全的對象管理,那么這個類仍舊是線程安全的


2.3加鎖機制

要保證狀態(tài)一致性轧粟,就需要單個原子操作中更新所有相關(guān)的狀態(tài)變量

2.3.1內(nèi)置鎖

同步代碼塊(Synchronized Block)

每個Java對象都可以用作一個實現(xiàn)同步的鎖策治,這些鎖被稱為內(nèi)置鎖(Intrinsic Lock)或者監(jiān)視器鎖(Monitor Lock)

內(nèi)置鎖是一種互斥鎖,最多只有一個線程持有這個鎖


2.3.2重入

重入意味著獲取鎖的操作的粒度是“線程”兰吟,而不是“調(diào)用”

重入提升了加鎖行為的封裝性通惫,因此簡化了面向?qū)ο蟛l(fā)代碼的執(zhí)行


2.4用鎖來保護狀態(tài)

鎖能夠使其被保護的對象以串行方式來執(zhí)行

一種常見的加鎖機制:將所有可變狀態(tài)都封裝在對象內(nèi)部,并通過對象的內(nèi)置鎖對所有訪問可變狀態(tài)的代碼路徑進行同步混蔼,使得該對象上不會發(fā)生并發(fā)訪問

對于每個包含多個變量的不變性條件履腋,其中涉及的所有變量都需要由同一個鎖來保護


2.5活躍性與性能

通常,在簡單性與性能之間存在著相互制約因素惭嚣,但是實現(xiàn)某個同步策略時遵湖,一定不要為了性能而犧牲簡單性(這可能會破壞安全性)

當執(zhí)行時間較長的計算或者可能無法快速完成的操作(例如網(wǎng)絡(luò)I/O或者控制臺I/O),一定不要持有鎖


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市晚吞,隨后出現(xiàn)的幾起案子延旧,更是在濱河造成了極大的恐慌,老刑警劉巖载矿,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垄潮,死亡現(xiàn)場離奇詭異,居然都是意外死亡闷盔,警方通過查閱死者的電腦和手機凑队,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胜嗓,“玉大人粉铐,你說我怎么就攤上這事∧绻埃” “怎么了逃贝?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迫摔。 經(jīng)常有香客問我沐扳,道長,這世上最難降的妖魔是什么句占? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任沪摄,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杨拐。我一直安慰自己祈餐,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布哄陶。 她就那樣靜靜地躺著帆阳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屋吨。 梳的紋絲不亂的頭發(fā)上蜒谤,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音离赫,去河邊找鬼芭逝。 笑死,一個胖子當著我的面吹牛渊胸,可吹牛的內(nèi)容都是我干的旬盯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼翎猛,長吁一口氣:“原來是場噩夢啊……” “哼胖翰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起切厘,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤萨咳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疫稿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體培他,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年遗座,在試婚紗的時候發(fā)現(xiàn)自己被綠了舀凛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡途蒋,死狀恐怖猛遍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情号坡,我是刑警寧澤懊烤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站宽堆,受9級特大地震影響腌紧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜畜隶,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一寄啼、第九天 我趴在偏房一處隱蔽的房頂上張望逮光。 院中可真熱鬧,春花似錦墩划、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至极景,卻和暖如春察净,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盼樟。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工氢卡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晨缴。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓译秦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親击碗。 傳聞我的和親對象是個殘疾皇子筑悴,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

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