Java并發(fā)編程學(xué)習(xí)

不可變對象可以在沒有額外同步的情況下亏较,安全地用于任意線程遏佣;甚至發(fā)布它們時亦不需要同步。

安全發(fā)布的模式:
如果一個對象是可變的讯壶,它就必須被安全地發(fā)布料仗,通常發(fā)布線程與消費(fèi)線程都必須同步化。如何確保消費(fèi)線程能夠看到處于發(fā)布當(dāng)時的對象狀態(tài)伏蚊,我們要解決對象發(fā)布后對其修改的可見性問題立轧。

為了安全地發(fā)布對象,對象的引用以及對象的狀態(tài)必須同時對其他線程可見丙挽。一個正確創(chuàng)建的對象可以通過下列條件安全地發(fā)布:

  • 通過靜態(tài)初始化器初始化對象的引用肺孵;
  • 將它的引用存儲到 volatile域或 AtomicReference;
  • 將它的引用存儲到正確創(chuàng)建的對象的final域中颜阐;
  • 或者將它的引用存儲到由鎖正確保護(hù)的域中平窘。

線程安全庫中的容器提供了如下的線程安全保證:

  • 置入Hashtable、synchronizedMap凳怨、ConcurrentMap 中的主鍵以及健值瑰艘,會安全地發(fā)布到可以從Map獲得它們的任意線程中,無論是直接獲得還是通過迭代器(iterator)獲得:
  • 置入vector肤舞、CopyOnWriteArrayList紫新、CopyOnWriteArraySet、synchronizedList或者synchronizedSet中的元素李剖,會安全地發(fā)布到可以從容器中獲得它的任意線程中芒率。
  • 置入BlockingQueue 或者 ConcurrentLinkedQueue 的元素,會安全地發(fā)布到可以從隊列中獲得它的任意線程中篙顺。
//靜態(tài)初始化器示例:
public static Holder holder = new Holder(42);

發(fā)布對象的必要條件依賴于對象的可變性:

  • 不可變對象可以通過任意機(jī)制發(fā)布偶芍;
  • 高效不可變對象必須要安全發(fā)布充择;
  • 可變對象必須要安全發(fā)布,同時必須要線程安全或者被鎖保護(hù)匪蟀。

安全地共享對象
在并發(fā)程序中椎麦,使用共享對象的一些最有效的策略如下:

  • 線程限制:一個線程限制的對象,通過限制在現(xiàn)場中材彪,而被線程獨(dú)占观挎,且只能被占有它的線程修改。
  • 共享只讀(share read-only):一個共享的只讀對象段化,在沒有額外同步的情況下嘁捷,可以被多個線程并發(fā)地訪問,但是任何線程都不能修改它显熏。共享只讀對象包括可變對象與高效不可變對象普气。
  • 共享線程安全(shared thread-safe):一個線程安全的對象在內(nèi)部進(jìn)行同步,所以其他線程無須額外同步佃延,就可以通過公共接口隨意地訪問它现诀。
  • 被守護(hù)的(Guarded):一個被守護(hù)的對象只能通過特定的鎖來訪問。被守護(hù)的對象包括那些被線程安全對象封裝的對象履肃,和已知被特定的鎖保護(hù)起來的已發(fā)布對象仔沿。

將數(shù)據(jù)封裝在對象內(nèi)部,把對數(shù)據(jù)的訪問限制在對象的方法上尺棋,更易確保線程在訪問數(shù)據(jù)時總能獲得正確的 鎖封锉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市膘螟,隨后出現(xiàn)的幾起案子成福,更是在濱河造成了極大的恐慌,老刑警劉巖荆残,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奴艾,死亡現(xiàn)場離奇詭異,居然都是意外死亡内斯,警方通過查閱死者的電腦和手機(jī)蕴潦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俘闯,“玉大人潭苞,你說我怎么就攤上這事≌胬剩” “怎么了此疹?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我蝗碎,道長振诬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任衍菱,我火速辦了婚禮,結(jié)果婚禮上肩豁,老公的妹妹穿的比我還像新娘脊串。我一直安慰自己,他們只是感情好清钥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布琼锋。 她就那樣靜靜地躺著,像睡著了一般祟昭。 火紅的嫁衣襯著肌膚如雪缕坎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天篡悟,我揣著相機(jī)與錄音谜叹,去河邊找鬼。 笑死搬葬,一個胖子當(dāng)著我的面吹牛荷腊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播急凰,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼女仰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抡锈?” 一聲冷哼從身側(cè)響起疾忍,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎床三,沒想到半個月后一罩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撇簿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年擒抛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片补疑。...
    茶點(diǎn)故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡歧沪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莲组,到底是詐尸還是另有隱情诊胞,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站撵孤,受9級特大地震影響迈着,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜邪码,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一裕菠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闭专,春花似錦奴潘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至平委,卻和暖如春奈虾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背廉赔。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工肉微, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜡塌。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓浪册,卻偏偏與公主長得像,于是被迫代替她去往敵國和親岗照。 傳聞我的和親對象是個殘疾皇子村象,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評論 2 350

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