目錄
常用鎖
synchronized
ReentrantLock
ReadWriteLock
Semaphore
常用鎖的介紹可參見:Java常用鎖機(jī)制簡介
synchronized
了解
對于初學(xué)者旋膳,想了解synchronized
的使用的話细移,可以參考Java中synchronized的用法
總結(jié)
- 按加鎖范圍大小黍图,分為類鎖和對象鎖贴浙。
- 按加鎖方法蜒什,分為代碼塊加鎖和方法加鎖平窘。
關(guān)于類鎖和對象鎖需要著重區(qū)分下卑雁。對象鎖只會(huì)影響單個(gè)對象,而類鎖會(huì)影響該類下所有的對象折剃。
進(jìn)階
synchronized
進(jìn)階學(xué)習(xí)的話,需要了解下其實(shí)現(xiàn)原理:Synchronized及其實(shí)現(xiàn)原理
總結(jié)
- 每個(gè)對象都有個(gè)monitor對象像屋,加鎖就是在競爭monitor對象
- 代碼塊加鎖是在前后分別加上
monitorenter
和monitorexit
指令來實(shí)現(xiàn)的- 方法加鎖是通過一個(gè)標(biāo)記位來判斷的
再進(jìn)階
關(guān)于“synchronized
比較慢”的誤解
在Java1.5中怕犁,synchronized是一個(gè)重量級(jí)操作,需要調(diào)用操作系統(tǒng)相關(guān)接口开睡,性能是低效的因苹,有可能給線程加鎖消耗的時(shí)間比有用操作消耗的時(shí)間更多。到了Java1.6篇恒,synchronized進(jìn)行了很多的優(yōu)化扶檐,有適應(yīng)自旋、鎖消除胁艰、鎖粗化款筑、輕量級(jí)鎖及偏向鎖等,效率有了本質(zhì)上的提高腾么。在之后推出的Java1.7與1.8中奈梳,均對該關(guān)鍵字的實(shí)現(xiàn)機(jī)理做了優(yōu)化。
關(guān)于鎖的優(yōu)化解虱,可以參考
總結(jié)
- 引入了偏向鎖和輕量級(jí)鎖。都是在對象頭中有標(biāo)記位殴泰,不需要經(jīng)過操作系統(tǒng)加鎖
- 鎖可以從偏向鎖升級(jí)到輕量級(jí)鎖于宙,再升級(jí)到重量級(jí)鎖。這種升級(jí)過程叫做鎖膨脹
- JDK 1.6中默認(rèn)是開啟偏向鎖和輕量級(jí)鎖悍汛,可以通過
-XX:-UseBiasedLocking
來禁用偏向鎖
ReentrantLock
了解
對于初學(xué)者捞魁,了解ReentrantLock
,可通過參考ReentrantLock的使用
ReentrantLock
的使用還是比較簡單的
進(jìn)階
要深入理解ReentrantLock
离咐,就需要知道其實(shí)現(xiàn)原理谱俭。參考文章:
總結(jié)
ReentrantLock
是通過大名鼎鼎的AQS來實(shí)現(xiàn)的。弄懂了AQS宵蛀,就弄懂了ReentrantLock
ReentrantLock
分為公平鎖和非公平鎖引申
除了ReentrantLock
昆著,CountDownLatch
和Semaphore
也是通過AQS實(shí)現(xiàn)的。關(guān)于AQS糖埋,可參考未完待續(xù)...
synchronized和ReentrantLock的對比
synchronized
和ReentrantLock
的對比是個(gè)永恒的話題宣吱。這兩個(gè)常用的加鎖方式有同有異,互為補(bǔ)充瞳别。ReentrantLock
的出現(xiàn)不是為了替代synchronized
征候,而是彌補(bǔ)synchronized
的不足杭攻。
關(guān)于synchronized
和ReentrantLock
的異同,網(wǎng)上的文章多如牛毛疤坝。比較好的有:
總結(jié)
synchronized
能做的,ReentrantLock
都能做跑揉,并且還能做更多锅睛。但是synchronized
依然有用武之地ReentrantLock
相比synchronized
的優(yōu)勢是可中斷、公平鎖历谍、多個(gè)鎖现拒。這種情況下需要使用ReentrantLock
。只要是synchronized
能做到的望侈,還是使用synchronized
印蔬。
鎖分類
Java中的鎖有很多概念和術(shù)語,如可重入鎖脱衙、公平鎖侥猬、偏向鎖等。這些術(shù)語中捐韩,有些指的是同一種鎖退唠,有些是表示的鎖的特征。如synchronized
同時(shí)是可重入鎖荤胁、非公平鎖瞧预、互斥鎖等。
這些術(shù)語只是從不同的緯度來描述鎖的應(yīng)用場景仅政。只有了解的這些術(shù)語松蒜,術(shù)語所指代的特征,以及常用鎖跟這些特征的關(guān)系已旧,才能熟練并且合理地使用鎖。
可重入鎖
參考可重入鎖
總結(jié)
- 不可重入的話召娜,一個(gè)鎖在嵌套中使用會(huì)把自己鎖死
synchronized
和ReentrantLock
都是可重入鎖运褪,可放心使用
公平鎖/非公平鎖
總結(jié)
synchronized
是非公平鎖,ReentrantLock
默認(rèn)構(gòu)造函數(shù)也是非公平鎖- 非公平鎖的性能比公平鎖要高很多
互斥鎖/共享鎖
總結(jié)
- 互斥和共享的概念比較簡單玖瘸,并且在任何語言中都存在
悲觀鎖/樂觀鎖
總結(jié)
- 悲觀鎖和樂觀鎖并非是一種實(shí)際的鎖秸讹,而是指一種加鎖的概念
- 這種也并非java獨(dú)有,在其他語言和數(shù)據(jù)庫中都有廣泛的應(yīng)用
- 悲觀鎖在java中一般指代常見的各種鎖
- 樂觀鎖在java中一般指代CAS操作
偏向鎖/輕量級(jí)鎖/重量級(jí)鎖
參考:
總結(jié)
- 偏向鎖璃诀、輕量級(jí)鎖是針對重量級(jí)鎖做優(yōu)化而提出來的概念和實(shí)施方案
- 這些優(yōu)化大部分情況下對于開發(fā)來講是透明的,默認(rèn)開啟
分段鎖
參考java多線程 -- ConcurrentHashMap 鎖分段機(jī)制
總結(jié)
- 分段鎖也并非一種實(shí)際的鎖蔑匣,而是一種思想
- ConcurrentHashMap是學(xué)習(xí)分段鎖的最好實(shí)踐
自旋鎖
參考自旋鎖
總結(jié)
- 自旋鎖也是一種思想劣欢,一般需要配合CAS使用
java.util.concurrent.atomic
包下的原子類是自旋鎖的很好的實(shí)踐
鎖優(yōu)化
鎖優(yōu)化分為兩種棕诵,一種是JVM開發(fā)團(tuán)隊(duì)對鎖的優(yōu)化,這個(gè)對應(yīng)用開發(fā)人員來講凿将,一般不需要關(guān)心校套。另一種是應(yīng)用開發(fā)人員需要關(guān)注的鎖優(yōu)化,這屬于開發(fā)素養(yǎng)的范疇牧抵。
JVM鎖優(yōu)化
總結(jié)
- 鎖粗化
- 鎖消除
應(yīng)用開發(fā)鎖優(yōu)化
參考高并發(fā)Java(9):鎖的優(yōu)化和注意事項(xiàng)
總結(jié)
- 鎖優(yōu)化是JVM實(shí)現(xiàn)的對鎖的一種加速笛匙,算是JVM開發(fā)人員給應(yīng)用開發(fā)人員提供的福利
- 大部分情況下,應(yīng)用開發(fā)人員不需要關(guān)心鎖優(yōu)化犀变。