更新時間:2022年01月10日17時24分 來源:傳智教育 瀏覽次數:
掌握 lock 與 synchronized 的區(qū)別
理解 ReentrantLock 的公平、非公平鎖
理解 ReentrantLock 中的條件變量
lock 與 synchronized 的區(qū)別有三個層面
語法層面
* synchronized 是關鍵字,源碼在 jvm 中,用 c++ 語言實現
* Lock 是接口,源碼由 jdk 提供,用 java 語言實現
* 使用 synchronized 時,退出同步代碼塊鎖會自動釋放,而使用 Lock 時,需要手動調用 unlock 方法釋放鎖
* 二者均屬于悲觀鎖、都具備基本的互斥、同步、鎖重入功能
* Lock 提供了許多 synchronized 不具備的功能,例如獲取等待狀態(tài)、公平鎖、可打斷、可超時、多條件變量
* Lock 有適合不同場景的實現,如 ReentrantLock, ReentrantReadWriteLock
* 在沒有競爭時,synchronized 做了很多優(yōu)化,如偏向鎖、輕量級鎖,性能不賴
* 在競爭激烈時,Lock 的實現通常會提供更好的性能
公平鎖的公平體現
已經處在阻塞隊列**中的線程(不考慮超時)始終都是公平的,先進先出
公平鎖是指**未處于阻塞隊列**中的線程來爭搶鎖,如果隊列不為空,則老實到隊尾等待
非公平鎖是指**未處于阻塞隊列**中的線程來爭搶鎖,與隊列頭喚醒的線程去競爭,誰搶到算誰的
公平鎖會降低吞吐量,一般不用
* ReentrantLock 中的條件變量功能類似于普通 synchronized 的 wait,notify,用在當線程獲得鎖后,發(fā)現條件不滿足時,臨時等待的鏈表結構
* 與 synchronized 的等待集合不同之處在于,ReentrantLock 中的條件變量可以有多個,可以實現更精細的等待、喚醒控制
代碼說明
day02.TestReentrantLock 用較為形象的方式演示 ReentrantLock 的內部結構
Synchronized原理是什么?Synchronized原理詳解