鎖的目的是解決資源爭用問題,不同類型的鎖是為了在不同場景下資源爭用更高效。
當(dāng)然Java解決資源爭用問題,不僅提供了有鎖編程,還提供了原子類、分段鎖等可以直接使用的原生類,在java.lang.concurrent包下。
但需要注意的是,無鎖編程適用于競爭不激烈的情況下,CAS太多性能同樣會下降。
Java 中根據(jù)不同的分類標(biāo)準(zhǔn),可以將鎖如下分類,一種鎖可能同時具有其他幾個特性。
* 偏向鎖 / 輕量級鎖 / 重量級鎖
* 可重入鎖 / 非可重入鎖
* 共享鎖 / 獨占鎖
* 公平鎖 / 非公平鎖
* 悲觀鎖 / 樂觀鎖
* 自旋鎖 / 非自旋鎖
* 可中斷鎖 / 不可中斷鎖
JVM進程內(nèi)實現(xiàn)鎖的方式可以分為兩類
- 內(nèi)置鎖,JVM 內(nèi)部支持的,sychronized關(guān)鍵字
由JVM控制CAS,對用戶透明
- 基于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)置鎖原理