1、高效併發是jdk1.5到jdk1.6的乙個重要改進,出現了適應性自旋(adaptive spinning)、鎖消除(lock elimination)、鎖粗化(lock coarsening)、輕量級鎖(lightweight locking)和偏向鎖(biased locking)等一系列鎖優化技術。
2、自旋鎖與自適應自旋:
(1)自旋鎖:互斥同步對效能最大的影響是阻塞的實現需要轉入核心態完成,由於通常情況下共享資料的鎖定狀態只會持續很短的一段時間,如果讓乙個執行緒在等待獲取鎖的時候多等一會,占用cpu的執行時間但是不會進入阻塞狀態,執行乙個忙迴圈(自旋),即實現了自旋鎖。
(2)自旋鎖在jdk1.4.2中已經引入,自旋不能代替阻塞,因為自旋需要占用處理器時間,自旋等待的時間必須有限制,預設自旋次數為10次,可以使用引數-xx:preblockspin設定。
(3)自適應自旋:jdk1.6引入了自適應的自旋鎖,即自旋的時間不再固定,而是由前一次在同乙個鎖上的自旋時間及鎖的擁有者的狀態來決定。如果判斷出自旋獲取鎖的成功概率大,則允許自旋等待較長時間,反之可能省略自旋過程直接進入阻塞,避免浪費處理器資源。
3、鎖消除
4、鎖粗化:虛擬機器探測到如果有一系列的連續操作都對同乙個物件反覆加鎖和解鎖,將會把加鎖同步的範圍擴充套件(粗化)到整個操作序列的外部,這樣只需加鎖一次就可以了。
5、輕量級鎖:通過使用cas操作避免互斥同步的開銷,在沒有多執行緒競爭的前提下,可以減少傳統的重量級鎖產生的效能消耗。
6、偏向鎖:在無競爭的情況下把整個同步都消除掉,虛擬機器通過引數-xx:+usebiasedlocking(jdk1.6預設使用)設定。
7、鎖的標記存放在hotspot虛擬機器物件頭中(mark word):
儲存內容
標誌位狀態
物件雜湊碼、物件分代年齡
01未鎖定
指向鎖記錄的指標
00輕量級鎖定
指向重量級鎖的指標
10膨脹(重量級鎖定)
空,不需要記錄資訊
11gc標記
偏向執行緒id、偏向時間戳、物件分代年齡
01可偏向
8、偏向鎖存在競爭則撤銷偏向可轉為輕量級鎖,輕量級鎖可膨脹公升級為重量級鎖。
JVM學習 (九)執行緒安全和鎖優化
從以前流行的面向過程程式設計到現在的物件導向程式設計,物件導向程式設計極大的提公升了現代軟體開發的效率和規模,但是不可避免的是物件之間的相互切換,為了讓程式維護的更好更好,我們必須引入 高效併發 來保證併發的正確性 安全性和效率性。比較寬泛的定義 沒有什麼可以操作性 如果乙個物件可以被多個執行緒同時...
JVM對鎖的優化
作為一款公用的平台,jdk肯定也對併發程式的效能絞盡腦汁,內部也想盡一切辦法來提高併發時候的吞吐量。下面介紹幾種jdk內部的鎖優化策略 一.鎖偏向 二.輕量級鎖 如果偏向鎖失敗,虛擬機器並不會立即掛起執行緒,它還會使用一種稱為輕量級鎖的優化手段。輕量級鎖的操作也很輕便,它只是簡單的將物件的頭部作為指...
jvm隨筆9 鎖優化
1.自旋鎖 問題 掛起和恢復執行緒要轉入核心態中完成,許多應用,共享資料的鎖定狀態只會持續很短一段時間,為了這段時間去掛起和恢復執行緒並不值得。兩個或以上的執行緒並行執行時,可以讓後面請求鎖的那個執行緒等一下,但不放棄處理器的執行時間,看看持有鎖的執行緒是否很快就會釋放鎖。為了讓執行緒等待,只需讓執...