天天看點

JAVA—— synchronized 和 ReentrantLock 的差別

synchronized 的局限性

1、當線程嘗試擷取鎖的時候,如果擷取不到鎖會一直阻塞,不能臨時取消(類似排隊時間太長太耗時間,我不想等了,揍你)

2、如果擷取了鎖的線程進入休眠或者阻塞,除非目前線程異常,否則其他線程嘗試擷取鎖必須一緻等待

synchronized 和 ReentrantLock 的差別

1、系統地位

synchronized 是内置關鍵字,JVM系統級

ReentrantLock是一個類,文法級

2、獨占性

synchronized 是獨占鎖,加鎖和解鎖的過程自動擋

ReentrantLock 是獨占鎖,加鎖和解鎖的過程手動擋

3、可重入

synchronized 可重入

ReentrantLock 可重入,但加鎖和解鎖需要手動進行,且次數需一樣,否則其他線程無法獲得鎖

4、公平性
  • 公平鎖:在鎖上等待時間最長的線程優先獲得鎖的使用權(排隊時間長的優先擷取鎖)
  • 非公平鎖:弱肉強食,誰先搶到就是誰

synchronized是非公平鎖

ReentrantLock是既可以是公平鎖,又可以是非公平鎖。預設非公平鎖

注:如果想将ReentrantLock設定為公平鎖,需要在構造器傳參,設定為true

5、逾時等待

synchronized隻能死等

ReentrantLock 靈活,可以設定逾時不等

6、對中斷的支援不同(了解)