Java線程公平鎖和非公平鎖的差異講解
公平鎖,顧名思義,它是公平的,可以保證獲取鎖的線程按照先來(lái)后到的順序,獲取到鎖。
非公平鎖,顧名思義,各個(gè)線程獲取到鎖的順序,不一定和它們申請(qǐng)的先后順序一致,有可能后來(lái)的線程,反而先獲取到了鎖。
在實(shí)現(xiàn)上,公平鎖在進(jìn)行l(wèi)ock時(shí),首先會(huì)進(jìn)行tryAcquire()操作。在tryAcquire中,會(huì)判斷等待隊(duì)列中是否已經(jīng)有別的線程在等待了。如果隊(duì)列中已經(jīng)有別的線程了,則tryAcquire失敗,則將自己加入隊(duì)列。如果隊(duì)列中沒(méi)有別的線程,則進(jìn)行獲取鎖的操作。
/** * Fair version of tryAcquire. Don't grant access unless * recursive call or no waiters or is first. **/ protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (!hasQueuedPredecessors() && compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; }
非公平鎖,在進(jìn)行l(wèi)ock時(shí),會(huì)直接嘗試進(jìn)行加鎖,如果成功,則獲取到鎖,如果失敗,則進(jìn)行和公平鎖相同的動(dòng)作。
從公平鎖和非公平的實(shí)現(xiàn)上來(lái)看,他們的操作基本相同,唯一的區(qū)別在于,在lock時(shí),非公平鎖會(huì)直接先進(jìn)行嘗試加鎖的操作。
當(dāng)前一個(gè)線程完成了鎖的使用,并且釋放了,而且此時(shí)等待隊(duì)列非空時(shí),如果這是有新線程申請(qǐng)鎖,那么,公平鎖和非公平鎖的表現(xiàn)就會(huì)出現(xiàn)差異。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
swing中Tree與滾動(dòng)條用法實(shí)例分析
這篇文章主要介紹了swing中Tree與滾動(dòng)條用法,以實(shí)例形式分析了java基于swing實(shí)現(xiàn)圖形界面的使用技巧,需要的朋友可以參考下2015-09-09java學(xué)習(xí)筆記之DBUtils工具包詳解
下面小編就為大家分享一篇java學(xué)習(xí)筆記之DBUtils工具包詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01SpringBoot和Vue實(shí)現(xiàn)動(dòng)態(tài)二維碼的示例代碼
二維碼在現(xiàn)代社交和營(yíng)銷活動(dòng)中被廣泛使用,本文主要介紹了SpringBoot和Vue實(shí)現(xiàn)動(dòng)態(tài)二維碼的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02詳談Map的key、value值的數(shù)據(jù)類型不能為基本類型的原因
這篇文章主要介紹了詳談Map的key、value值的數(shù)據(jù)類型不能為基本類型的原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09java中Base64字符串出現(xiàn)不合法字符的問(wèn)題解決
非法的base64數(shù)據(jù)可能導(dǎo)致編碼或解碼過(guò)程出錯(cuò),本文主要介紹了java中Base64字符串出現(xiàn)不合法字符的問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06