JDK6 synchronize鎖的優化

2021-10-03 16:22:07 字數 963 閱讀 8898

共享資料持有時間較短的時候,切換執行緒開銷不值得,通過迴圈等待鎖釋放,不讓出cpu資源。

鎖的自旋次數不固定,由前一次在同乙個鎖上的自旋時間及鎖的持有者狀態,也就是成功率來確定自旋次數,達到自旋次數還未獲取鎖就進入阻塞。適應自旋鎖會根據自旋獲取鎖的成功率來調整自旋次數,如果獲取鎖成功率高會調高自旋次數,否則反之。

jit編譯時,對執行上下文掃瞄,去除不可能存在競爭的鎖。

public void methed(string s)
將多個連續的加鎖、解鎖操作(鎖物件相同)連線在一起,擴充套件成乙個範圍更大的鎖,避免頻繁反覆加鎖解鎖。

大多數情況下, 鎖不存在多執行緒競爭的情況, 都是單個執行緒持有。如果乙個執行緒獲得了鎖,此時markword的結構也變為偏向鎖結構,當執行緒再次請求鎖時,只需檢查markword的鎖標記位是否為偏向鎖以及當前執行緒id是否等於mark word中的threadid即可,省去了大量有關鎖申請的操作。偏向鎖用於只有乙個執行緒訪問同步塊或同步方法的場景。

輕量級鎖由偏向鎖公升級而來,在**進入同步塊時候,如果物件沒有被鎖定,虛擬機器首先將在當前執行緒的棧幀中建立名為鎖記錄(lock record)的空間,並將物件頭中的mark word複製到鎖記錄中,然後虛擬機器將使用cas操作嘗試將物件頭的mark word替換為指向鎖記錄的指標,並將執行緒棧幀中的lock record裡的owner指標指向markword。如果成功,那麼這個執行緒就擁有了這個物件的鎖,並且將mark word中的標記位改為00,表示這個物件處於輕量級鎖狀態。如果失敗,表示有執行緒競爭,當前執行緒便嘗試使用自旋鎖來獲取鎖。如果當有兩條以上的執行緒在搶占資源,那輕量級鎖就不再有效,要膨脹為重量級鎖,鎖的狀態更改為10。輕量級鎖用於執行緒交替執行同步塊或者同步方法的場景。

jdk6和jdk7的區別

substring jdk6 string是通過字元陣列實現的。在jdk 6 中,string類包含三個成員變數 char value,int offset,int count。他們分別用來儲存真正的字元陣列,陣列的第乙個位置索引以及字串中包含的字元個數。當呼叫substring方法的時候,會建立乙...

JDK6和JDK7中的substring 方法

substring int beginindex,int endindex 方法在jdk6和jdk7中是不同的。明白它們之間的差別可以幫助我們更好的使用這個方法。為了簡單起見,下面使用substring 代替substring int beginindex,int endindex substrin...

JDK6與JBoss的web service的問題

最近寫了簡單的web service,用的最簡單的annotation的方式,然後部署到jboss5上去。後來發現如果我用eclipse生成的web service client去執行這個web service,在jboss端會出現以下異常 後來才知道是jdk6的問題,因為我的jboss是用jdk6...