Java 多線程同步

線程安全相關(guān)問題

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

當多個線程訪問同一個對象時,如果不用考慮這些線程在運行時環(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的應(yīng)用方式主要有修飾實例方法,修飾靜態(tài)方法,修飾代碼塊
  • 修飾實例方法

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

同步鎖和實例對象一一對應(yīng),如果是一個線程 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)用等待喚醒機制相關(guān)方法時,必須獲得當前對象的monitor對象,而只有synchronized關(guān)鍵字才能獲取到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.itdecent.cn/p/d52fea0d6ba5

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

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

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

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