jvm規範規定jvm基於進入和退出monitor物件來實現方法同步和**塊同步,但兩者的實現細節不一樣。**塊同步是使用monitorenter和monitorexit指令實現,而方法同步是使用另外一種方式實現的,細節在jvm規範裡並沒有詳細說明,但是方法的同步同樣可以使用這兩個指令來實現。monitorenter指令是在編譯後插入到同步**塊的開始位置,而monitorexit是插入到方法結束處和異常處, jvm要保證每個monitorenter必須有對應的monitorexit與之配對。任何物件都有乙個 monitor 與之關聯,當且乙個monitor 被持有後,它將處於鎖定狀態。執行緒執行到 monitorenter 指令時,將會嘗試獲取物件所對應的 monitor 的所有權,即嘗試獲得物件的鎖。
public class testmain
public void methodb()
}public static void main(string args)
}
位元組碼
public class testmain
process finished with exit code 0
synchronized 實現死鎖
synchronized首先明確鎖的是物件而不是方法 如果乙個物件有兩個方法,兩個執行緒分別呼叫其中乙個方法,如果鎖傳入的引數為 同一物件與不同物件,執行緒執行結果是不一樣的 死鎖 如下 package com.hanshow.wise.portal.center.controller.common...
synchronized實現可見性
jmm關於synchronized的兩條規定 1 執行緒解鎖前,必須把共享變數的最新值重新整理到主記憶體中 2 執行緒加鎖時,將清空工作記憶體中共享變數的值,從而使用共享變數時需要從主記憶體中重新獲取最新的值 注意 加鎖與解鎖需要是同一把鎖 通過以上兩點,可以看到synchronized能夠實現可見...
ConcurrentHashMap實現原理
concurrenthashmap實現原理 在jdk1.7中 concurrenthashmap是通過segment陣列 hashentry陣列 單鏈表的結構進行儲存資料。segment陣列中存放的是hashentry陣列的首位址,hashentry中存放的是乙個單鏈表 首節點位址 put 我們通過...