Java 多線程同步

線程安全相關問題

  • 如何定義一個對象是否是線程安全的

當多個線程訪問同一個對象時,如果不用考慮這些線程在運行時環(huán)境下的調(diào)度和交替運行,也不需要進行額外的同步,或者在調(diào)用方進行任何其他的協(xié)調(diào)操作贼穆,調(diào)用這個對象的行為都可以獲取正確的結(jié)果,那這個對象是線程安全的

  • 線程安全問題的主要原因是

主內(nèi)存和工作內(nèi)存數(shù)據(jù)不一致杆查,重排序(為了性能優(yōu)化扮惦,一般包括編譯器指令重排序和處理器指令重排序)導致競態(tài)條件下的程序執(zhí)行不確定性

synchronized

  • synchronized的應用方式主要有修飾實例方法,修飾靜態(tài)方法亲桦,修飾代碼塊
  • 修飾實例方法

對實例方法的修飾崖蜜,同步鎖加在當前實例對象上,當一個線程訪問改實例的synchronized方法時客峭,其他線程不能訪問該方法

同步鎖和實例對象一一對應豫领,如果是一個線程 A 需要訪問實例對象 obj1 的 synchronized 方法 f1(當前對象鎖是obj1),另一個線程 B 需要訪問實例對象 obj2 的 synchronized 方法 f2(當前對象鎖是obj2)舔琅,是可以同時訪問同一個方法的等恐,因為兩個實例對象鎖并不同相同

  • 修飾靜態(tài)方法

對靜態(tài)方法的修飾,同步鎖加在當前類的class對象上(并非實例對象),所以不同的線程可以同時訪問同一實例的同步靜態(tài)方法和同步實例方法

  • 修飾代碼塊

實例對象鎖:synchronized(this){...}
class對象鎖:synchronized(XXX.class){...}

  • synchronized的可重入性
    在一個線程調(diào)用synchronized方法的同時在其方法體內(nèi)部調(diào)用該對象另一個synchronized方法课蔬,也就是說一個線程得到一個對象鎖后再次請求該對象鎖囱稽,是允許的,這就是synchronized的可重入性

  • synchronized與等待喚醒機制(wait, notify)

調(diào)用等待喚醒機制相關方法時二跋,必須獲得當前對象的monitor對象战惊,而只有synchronized關鍵字才能獲取到monitor對象,所以只有在同步方法塊中才能調(diào)用wait, notify方法

synchronized (obj) {
       obj.wait();
       obj.notify();
       obj.notifyAll();         
 }

wait和sleep的對比:sleep方法并不會讓當前線程釋放鎖扎即,但是wait會命令當前線程在執(zhí)行完同步代碼段后釋放持有的鎖

  • Java對象在內(nèi)存中的布局
名稱 內(nèi)容
對象頭 具體如下
實例變量 實例所屬類的屬性吞获,數(shù)組長度等信息
填充數(shù)據(jù) 保持字節(jié)對齊而填充的數(shù)據(jù)(因?qū)ο蟮钠鹗嫉刂繁仨毷?字節(jié)整數(shù)倍)
  • Java對象頭

JVM使用2個字節(jié)來存儲該信息,如果是數(shù)組對象谚鄙,會有1個額外的字節(jié)存儲數(shù)組長度

名稱 內(nèi)容
Mark Word 存儲對象的hashCode各拷、鎖信息或分代年齡或GC標志等信息
Class Metadata Address 類型指針指向?qū)ο蟮念愒獢?shù)據(jù),JVM通過這個指針確定該對象是哪個類的實例

Tips

  • 線程隨機競爭同一資源時闷营,如果對訪問順序敏感烤黍,那么此時存在靜態(tài)條件

ref

http://www.reibang.com/p/d52fea0d6ba5

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市粮坞,隨后出現(xiàn)的幾起案子蚊荣,更是在濱河造成了極大的恐慌,老刑警劉巖莫杈,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件互例,死亡現(xiàn)場離奇詭異,居然都是意外死亡筝闹,警方通過查閱死者的電腦和手機媳叨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來关顷,“玉大人糊秆,你說我怎么就攤上這事∫樗” “怎么了痘番?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長平痰。 經(jīng)常有香客問我汞舱,道長,這世上最難降的妖魔是什么宗雇? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任昂芜,我火速辦了婚禮,結(jié)果婚禮上赔蒲,老公的妹妹穿的比我還像新娘泌神。我一直安慰自己良漱,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布欢际。 她就那樣靜靜地躺著母市,像睡著了一般。 火紅的嫁衣襯著肌膚如雪损趋。 梳的紋絲不亂的頭發(fā)上窒篱,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音舶沿,去河邊找鬼。 笑死配并,一個胖子當著我的面吹牛括荡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播溉旋,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼畸冲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了观腊?” 一聲冷哼從身側(cè)響起邑闲,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梧油,沒想到半個月后苫耸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡儡陨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年褪子,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骗村。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫌褪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胚股,到底是詐尸還是另有隱情笼痛,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布琅拌,位于F島的核電站缨伊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏财忽。R本人自食惡果不足惜倘核,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望即彪。 院中可真熱鬧紧唱,春花似錦活尊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绰疤,卻和暖如春铜犬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轻庆。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工癣猾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人余爆。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓纷宇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛾方。 傳聞我的和親對象是個殘疾皇子像捶,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

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

  • 一拓春、為何寫 最為一個Android開發(fā)者,如果做得不夠深入可能為不會去處理多線程同步的問題亚隅,稍微簡單點可能使用一個...
    生椰拿鐵錘閱讀 1,970評論 0 6
  • 隨著互聯(lián)網(wǎng)的發(fā)展硼莽,網(wǎng)絡流量越來越大,對web的性能挑戰(zhàn)越來越大枢步,多線程的同步和異步則應運而生沉删。 首先說一個在業(yè)界容...
    時之令閱讀 7,929評論 2 0
  • Java多線程學習 [-] 一擴展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,957評論 1 18
  • 本文主要講了java中多線程的使用方法、線程同步醉途、線程數(shù)據(jù)傳遞矾瑰、線程狀態(tài)及相應的一些線程函數(shù)用法、概述等隘擎。 首先講...
    李欣陽閱讀 2,454評論 1 15
  • 林炳文Evankaka原創(chuàng)作品殴穴。轉(zhuǎn)載自http://blog.csdn.net/evankaka 本文主要講了ja...
    ccq_inori閱讀 654評論 0 4