Java中的鎖(入門)

鎖的目的是解決資源爭用問題,不同類型的鎖是為了在不同場景下資源爭用更高效。
當(dāng)然Java解決資源爭用問題,不僅提供了有鎖編程,還提供了原子類、分段鎖等可以直接使用的原生類,在java.lang.concurrent包下。
但需要注意的是,無鎖編程適用于競爭不激烈的情況下,CAS太多性能同樣會下降。

Java 中根據(jù)不同的分類標(biāo)準(zhǔn),可以將鎖如下分類,一種鎖可能同時具有其他幾個特性。

*   偏向鎖 / 輕量級鎖 / 重量級鎖

*   可重入鎖 / 非可重入鎖

*   共享鎖 / 獨占鎖

*   公平鎖 / 非公平鎖

*   悲觀鎖 / 樂觀鎖

*   自旋鎖 / 非自旋鎖

*   可中斷鎖 / 不可中斷鎖

JVM進程內(nèi)實現(xiàn)鎖的方式可以分為兩類

  1. 內(nèi)置鎖,JVM 內(nèi)部支持的,sychronized關(guān)鍵字

由JVM控制CAS,對用戶透明

  1. 基于Lock接口的,比如ReentrantLock等,需要手動加鎖和釋放

基于 AQS(AbstractQueuedSynchronizer),通過 CAS + CLH 隊列實現(xiàn)。
無鎖升級機制:Lock 的實現(xiàn)始終是“重量級”的(依賴隊列阻塞線程),但通過 自旋嘗試 優(yōu)化短期競爭。

synchronized 關(guān)鍵字

理解JVM內(nèi)置鎖,需要理解Java對象頭,對象頭包括兩部分:Mark Word 和 類型指針。32位虛擬機占用4+4共8個字節(jié);64位指針占用8+8共16個字節(jié),默認開啟指針壓縮是8+4+4(對齊補全)16個字節(jié)。
關(guān)鍵理解mark word結(jié)構(gòu),是一個bitmap,不同bit代表不同的含義。

從圖中可以看到不同所狀態(tài)下,對象頭內(nèi)容的變化。


mark word 結(jié)構(gòu)

閱讀這篇文章,寫的非常好
https://www.cnblogs.com/hongdada/p/14087177.html

那么輕量級鎖和偏向鎖的使用場景為:

  • 偏向鎖則是在只有一個線程執(zhí)行同步塊時進一步提高性能(一次自旋)
  • 輕量級鎖是為了在線程交替執(zhí)行同步塊時提高性能(多次自旋)
  • 重量級鎖(線程掛起)

synchronized 有兩種用法,分別是對象鎖類鎖??梢杂迷诜椒ㄉ希部梢杂迷诖a塊上。

內(nèi)置鎖原理
最后編輯于
?著作權(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ù)。

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