synchronized 的局限性
1、當線程嘗試擷取鎖的時候,如果擷取不到鎖會一直阻塞,不能臨時取消(類似排隊時間太長太耗時間,我不想等了,揍你)
2、如果擷取了鎖的線程進入休眠或者阻塞,除非目前線程異常,否則其他線程嘗試擷取鎖必須一緻等待
synchronized 和 ReentrantLock 的差別
1、系統地位
synchronized 是内置關鍵字,JVM系統級
ReentrantLock是一個類,文法級
2、獨占性
synchronized 是獨占鎖,加鎖和解鎖的過程自動擋
ReentrantLock 是獨占鎖,加鎖和解鎖的過程手動擋
3、可重入
synchronized 可重入
ReentrantLock 可重入,但加鎖和解鎖需要手動進行,且次數需一樣,否則其他線程無法獲得鎖
4、公平性
- 公平鎖:在鎖上等待時間最長的線程優先獲得鎖的使用權(排隊時間長的優先擷取鎖)
- 非公平鎖:弱肉強食,誰先搶到就是誰
synchronized是非公平鎖
ReentrantLock是既可以是公平鎖,又可以是非公平鎖。預設非公平鎖
注:如果想将ReentrantLock設定為公平鎖,需要在構造器傳參,設定為true
5、逾時等待
synchronized隻能死等
ReentrantLock 靈活,可以設定逾時不等