synchronized 關(guān)鍵字底層做了哪些優(yōu)化
JDK1.6后synchronize引入了,偏向鎖,輕量鎖,自旋鎖,鎖消除,鎖粗化等技術(shù)為了減少鎖的操作開銷
鎖有四種狀態(tài),他們會隨著競爭越激烈而升級,鎖只能升級不會降級,提高對獲得鎖和釋放鎖的效果
1:無鎖狀態(tài)
2:偏向鎖狀態(tài)
3:自旋鎖狀態(tài)
4:重量級鎖狀態(tài)
synchronized和ReentrantLock區(qū)別是什么?
synchronize和ReentrantLock都是可重入鎖,就是只要對象沒有釋放鎖還是可以獲取對象的
synchronize是JVM層面的,ReentrantLock是JDK層面的
synchronize和ReentrantLock控制等待和喚醒也是不同的,synchronize需要調(diào)用wait方法進入等待狀態(tài),需要其他線程調(diào)用notify和notifyall方法才能喚醒,ReentrantLock進入等待狀態(tài)要調(diào)用await方法,喚醒要調(diào)用signal和signalAll方法
synchronize在競爭資源時會一直等待,ReentrantLock可以嘗試獲取鎖,并得到獲取結(jié)果
synchronize加鎖代碼在執(zhí)行完任務(wù)或則出現(xiàn)異常后會釋放鎖,ReentrantLock不會釋放鎖,需要在finally代碼塊顯示釋放
synchronize是無法實現(xiàn)公平鎖的,ReentrantLock可以滿足公平鎖的