自Java 6/Java 7開始,Java虛擬機對內部鎖的實現(xiàn)進行了一些優(yōu)化。這些優(yōu)化主要包括鎖消除(Lock Elision)、鎖粗化(Lock Coarsening)、偏向鎖(Biased Locking)以及適應性鎖(Adaptive Locking)。這些優(yōu)化僅在Java虛擬機server模式下起作用(即運行Java程序時我們可能需要在命令行中指定Java虛擬機參數(shù)“-server”以開啟這些優(yōu)化)。

1 鎖消除
鎖消除(Lock Elision)是JIT編譯器對內部鎖的具體實現(xiàn)所做的一種優(yōu)化。

鎖消除(Lock Elision)示意圖
在動態(tài)編譯同步塊的時候,JIT編譯器可以借助一種被稱為逃逸分析(Escape Analysis)的技術來判斷同步塊所使用的鎖對象是否只能夠被一個線程訪問而沒有被發(fā)布到其他線程。如果同步塊所使用的鎖對象通過這種分析被證實只能夠被一個線程訪問,那么JIT編譯器在編譯這個同步塊的時候并不生成synchronized所表示的鎖的申請與釋放對應的機器碼,而僅生成原臨界區(qū)代碼對應的機器碼,這就造成了被動態(tài)編譯的字節(jié)碼就像是不包含monitorenter(申請鎖)和monitorexit(釋放鎖)這兩個字節(jié)碼指令一樣,即消除了鎖的使用。這種編譯器優(yōu)化就被稱為鎖消除(Lock Elision),它使得特定情況下我們可以完全消除鎖的開銷。
Java標準庫中的有些類(比如StringBuffer)雖然是線程安全的,但是在實際使用中我們往往不在多個線程間共享這些類的實例。而這些類在實現(xiàn)線程安全的時候往往借助于內部鎖。因此,這些類是鎖消除優(yōu)化的常見目標。
清單12-1 可進行鎖消除優(yōu)化的示例代碼
public class LockElisionExample {
public static String toJSON(ProductInfo productInfo) {
StringBuffer sbf = new StringBuffer();
sbf.append("{\"productID\":\"").append(productInfo.productID);
sbf.append("\",\"categoryID\":\"").append(productInfo.categoryID);
sbf.append("\",\"rank\":").append(productInfo.rank);
sbf.append(",\"inventory\":").append(productInfo.inventory);
sbf.append('}');
return sbf.toString();
}
}
網(wǎng)頁名稱:淺談Java虛擬機對內部鎖的四種優(yōu)化方式-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://chinadenli.net/article28/dhodjp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供域名注冊、全網(wǎng)營銷推廣、動態(tài)網(wǎng)站、網(wǎng)頁設計公司、企業(yè)建站、標簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)