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