[Java] 線程安全性

(1)核心在于管理:

在構(gòu)建穩(wěn)健的并發(fā)程序時(shí),必須正確的使用線程和鎖。
但這些終歸只是一些機(jī)制钮糖。
要編寫線程安全的代碼,其核心在于要對(duì)狀態(tài)訪問操作進(jìn)行管理酌住,特別是對(duì)共享的和可變的狀態(tài)的訪問此衅。

如果從一開始就設(shè)計(jì)一個(gè)線程安全的類超陆,那么比在以后再將這個(gè)類修改為線程安全的類要容易的多。

(2)不變性條件和后驗(yàn)條件:

在許多類中,都定義了一些不變性條件最域,用于判斷狀態(tài)是有效的還是無效的。
同樣在操作中還會(huì)包含一些后驗(yàn)條件來判斷狀態(tài)遷移是否是有效的详民。
類的不變性條件后驗(yàn)條件吁伺,約束了在對(duì)象上有哪些狀態(tài)狀態(tài)轉(zhuǎn)換有效的

(3)線程安全性:

正確性的含義是欺矫,某個(gè)類的行為與其規(guī)范完全一致稠歉。
線程安全性:當(dāng)多個(gè)線程訪問某個(gè)類時(shí),這個(gè)類始終都能表現(xiàn)出正確的行為汇陆,那么稱這個(gè)類是線程安全的怒炸。

(4)競(jìng)態(tài)條件

在并發(fā)編程中,這種由于不恰當(dāng)?shù)膱?zhí)行時(shí)序而出現(xiàn)不正確的結(jié)果毡代,是一種非常重要的情況阅羹,稱為競(jìng)態(tài)條件
當(dāng)某個(gè)計(jì)算的正確性取決于多個(gè)線程的交替執(zhí)行時(shí)序時(shí)教寂,那么就會(huì)發(fā)生競(jìng)態(tài)條件捏鱼。
換句話說,就是正確的結(jié)果要取決于運(yùn)氣酪耕。

觀察結(jié)果的失效就是大多數(shù)競(jìng)態(tài)條件的本質(zhì)导梆,基于一種可能失效的觀察結(jié)果,來做出判斷或者執(zhí)行某個(gè)計(jì)算。

要保持狀態(tài)的一致性看尼,就需要在單個(gè)原子操作中更新所有相關(guān)的狀態(tài)變量递鹉。
對(duì)于每個(gè)包含多個(gè)變量的不變性條件,其中涉及的所有變量都需要由同一個(gè)鎖來保護(hù)藏斩。

當(dāng)執(zhí)行時(shí)間較長(zhǎng)的計(jì)算躏结,或者,可能無法快速完成的操作時(shí)狰域,一定不要持有鎖媳拴。

(4)重排序:

重排序:在沒有同步的情況下,編譯器兆览,處理器以及運(yùn)行時(shí)等都可能對(duì)操作的執(zhí)行順序進(jìn)行一些意想不到的調(diào)整屈溉。在缺乏足夠同步的多線程程序中,要想對(duì)內(nèi)存操作的執(zhí)行順序進(jìn)行判斷抬探,幾乎無法得到正確的結(jié)論子巾。

當(dāng)把變量聲明為volatile類型后,編譯器與運(yùn)行時(shí)都會(huì)注意到這個(gè)變量是共享的驶睦,因此不會(huì)將該變量上的操作與其他內(nèi)存操作一起重排序砰左。
volatile變量不會(huì)被緩存在寄存器或者對(duì)其他處理器不可見的地方,因此在讀取volatile類型的變量時(shí)场航,總是會(huì)返回最新寫入的值缠导。

在訪問volatile變量時(shí),不會(huì)執(zhí)行加鎖操作溉痢,因此也就不會(huì)使執(zhí)行線程阻塞僻造,volatile變量是一種比sychronized關(guān)鍵字更輕量級(jí)的同步機(jī)制。

(5)加鎖與volatile:

加鎖機(jī)制孩饼,既可以確彼柘鳎可見性又可以確保原子性,而volatile變量只能確倍迫ⅲ可見性立膛。
當(dāng)且僅當(dāng)滿足以下所有條件時(shí),才應(yīng)該使用volatile變量:
(a)對(duì)變量的寫入操作不依賴變量的當(dāng)前值梯码,或者你能確保只有單個(gè)線程更新變量的值宝泵。
(b)該變量不會(huì)與其他狀態(tài)變量一起納入不變性條件中。
(c)在訪問變量時(shí)不需要加鎖轩娶。

(6)常用策略:

在并發(fā)程序中使用和共享對(duì)象時(shí)儿奶,可以使用一些實(shí)用的策略,包括:
線程封閉:線程封閉的對(duì)象只能由一個(gè)線程擁有鳄抒,對(duì)象被封閉在該線程中闯捎,并且只能由這個(gè)線程修改椰弊。
只讀共享:在沒有額外同步的情況下,共享的只讀對(duì)象可以由多個(gè)線程并發(fā)訪問瓤鼻,但任何線程都不能修改它秉版。共享的只讀對(duì)象包括不可變對(duì)象和事實(shí)不可變對(duì)象。
線程安全共享:線程安全的對(duì)象在其內(nèi)部實(shí)現(xiàn)同步娱仔,因此多個(gè)線程可以通過對(duì)象的公有接口來進(jìn)行訪問而不需要進(jìn)一步的同步沐飘。
保護(hù)對(duì)象:被保護(hù)的對(duì)象只能通過持有特定的鎖來訪問游桩。保護(hù)對(duì)象包括封裝在其他線程安全對(duì)象中的對(duì)象牲迫,以及已發(fā)布的并且由某個(gè)特定鎖保護(hù)的對(duì)象。

在設(shè)計(jì)線程安全類的過程中借卧,需要包含以下三個(gè)基本要素:
(a)找出構(gòu)成對(duì)象狀態(tài)的所有變量
(b)找出約束狀態(tài)變量的不變性條件
(c)建立對(duì)象狀態(tài)的并發(fā)訪問管理策略

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盹憎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子铐刘,更是在濱河造成了極大的恐慌陪每,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镰吵,死亡現(xiàn)場(chǎng)離奇詭異檩禾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疤祭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門盼产,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勺馆,你說我怎么就攤上這事戏售。” “怎么了草穆?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵灌灾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我悲柱,道長(zhǎng)锋喜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任豌鸡,我火速辦了婚禮嘿般,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘直颅。我一直安慰自己博个,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布功偿。 她就那樣靜靜地躺著盆佣,像睡著了一般往堡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上共耍,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天虑灰,我揣著相機(jī)與錄音,去河邊找鬼痹兜。 笑死穆咐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的字旭。 我是一名探鬼主播对湃,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼遗淳!你這毒婦竟也來了拍柒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤屈暗,失蹤者是張志新(化名)和其女友劉穎拆讯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體养叛,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡种呐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弃甥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爽室。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖潘飘,靈堂內(nèi)的尸體忽然破棺而出肮之,到底是詐尸還是另有隱情,我是刑警寧澤卜录,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布戈擒,位于F島的核電站,受9級(jí)特大地震影響艰毒,放射性物質(zhì)發(fā)生泄漏筐高。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一丑瞧、第九天 我趴在偏房一處隱蔽的房頂上張望柑土。 院中可真熱鬧,春花似錦绊汹、人聲如沸稽屏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狐榔。三九已至坛增,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間薄腻,已是汗流浹背收捣。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庵楷,地道東北人罢艾。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像尽纽,于是被迫代替她去往敵國(guó)和親咐蚯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • 并發(fā)編程簡(jiǎn)介 上古時(shí)期的計(jì)算機(jī)沒有操作系統(tǒng)蜓斧,它們從頭到尾只運(yùn)行一個(gè)程序仓蛆。這個(gè)程序獨(dú)占計(jì)算機(jī)上所有的資源睁冬。只有當(dāng)一個(gè)...
    EakonZhao閱讀 1,058評(píng)論 2 6
  • 從三月份找實(shí)習(xí)到現(xiàn)在挎春,面了一些公司,掛了不少豆拨,但最終還是拿到小米直奋、百度、阿里施禾、京東脚线、新浪、CVTE弥搞、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,206評(píng)論 11 349
  • Java8張圖 11邮绿、字符串不變性 12、equals()方法攀例、hashCode()方法的區(qū)別 13船逮、...
    Miley_MOJIE閱讀 3,696評(píng)論 0 11
  • 今天在a站閑逛,發(fā)現(xiàn)木魚影評(píng)有更新粤铭,說是9分鐘看完白色相簿2挖胃,雖說自己之前也聽說過白學(xué)家的梗,自己也玩過不少梆惯,但是...
    ascetic閱讀 167評(píng)論 0 0
  • 申請(qǐng)入駐今日頭條 (本人媒體名稱:八卦一天天) 活著像人----生存有道酱鸭,這叫人生…… 人活著不能僅僅為了簡(jiǎn)單生...
    八卦一天天閱讀 219評(píng)論 0 0