您好,登錄后才能下訂單哦!
synchronized與ReentrantLock的區別是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
相同點:
原子性,可見性,有序性,可重入性
不同點:
synchronized是非公平鎖,ReentrantLock可以創建公平與非公平鎖。
synchronized無法中斷一個正在等待獲取鎖的線程,ReentrantLock使用lockInterruptibly可以感知中斷獲取鎖的操作。
ReentrantLock可以實現非塊結構的加鎖。
ReentrantLock使用tryLock(time)來實現定時鎖,也可避免死鎖。
在實現生產者消費者模型時,synchronized加鎖,只能喚醒所有等待鎖的線程Object.notifyAll()。ReentrantLock可以使用condition減小等待鎖的粒度,在喚醒線程時就可以針對條件隊列來喚醒線程了Condition.signal(),提高效率。
在等待鎖時,使用synchronized的線程進入的是BLOCKED狀態,使用ReentrantLock的線程進入的是WAITING狀態。
選擇:
ReentrantLock并不是一種替代內置鎖的方法,而是當內置加鎖機制不適用時,作為一種可選擇的高級功能。
Java5時,ReentrantLock比內置鎖可以提供更好的競爭性能,但在Java6后,使用了改善后的算法來管理內置鎖,導致兩者的差異越來越小,所以還是優先使用內置鎖,僅當內置鎖不能滿足要求時,才可以考慮使用ReentrantLock。
PS:
在公平的鎖上,線程將按照它們發出請求的順序來獲得鎖,但在非公平的鎖上,則允許插隊:當一個線程請求非公平鎖時,如果在發出請求的同時該鎖狀態變為可用,那么這個線程將跳過隊列中所有等待線程并獲得這個鎖。拿一個生活中的場景舉例子,在我晚上經常去的一家肉餅店,肉餅出的很慢,我們都需要付錢拿號等待,結果有個顧客過來點餐,他正好點到肉餅的時候肉餅出鍋了,如果是非公平的場景,店員無視我們前面等待的顧客,就直接把肉餅給這位顧客了。
產生死鎖的4個必要條件:互斥條件;請求與保持條件;不剝奪條件;循環等待條件;tryLock破壞了不剝奪條件。
看完上述內容,你們掌握synchronized與ReentrantLock的區別是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。