Java線程公平鎖和非公平鎖的差異講解
公平鎖,顧名思義,它是公平的,可以保證獲取鎖的線程按照先來后到的順序,獲取到鎖。
非公平鎖,顧名思義,各個(gè)線程獲取到鎖的順序,不一定和它們申請的先后順序一致,有可能后來的線程,反而先獲取到了鎖。
在實(shí)現(xiàn)上,公平鎖在進(jìn)行l(wèi)ock時(shí),首先會進(jìn)行tryAcquire()操作。在tryAcquire中,會判斷等待隊(duì)列中是否已經(jīng)有別的線程在等待了。如果隊(duì)列中已經(jīng)有別的線程了,則tryAcquire失敗,則將自己加入隊(duì)列。如果隊(duì)列中沒有別的線程,則進(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í),會直接嘗試進(jìn)行加鎖,如果成功,則獲取到鎖,如果失敗,則進(jìn)行和公平鎖相同的動(dòng)作。
從公平鎖和非公平的實(shí)現(xiàn)上來看,他們的操作基本相同,唯一的區(qū)別在于,在lock時(shí),非公平鎖會直接先進(jìn)行嘗試加鎖的操作。
當(dāng)前一個(gè)線程完成了鎖的使用,并且釋放了,而且此時(shí)等待隊(duì)列非空時(shí),如果這是有新線程申請鎖,那么,公平鎖和非公平鎖的表現(xiàn)就會出現(xiàn)差異。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(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à)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01SpringBoot和Vue實(shí)現(xiàn)動(dòng)態(tài)二維碼的示例代碼
二維碼在現(xiàn)代社交和營銷活動(dòng)中被廣泛使用,本文主要介紹了SpringBoot和Vue實(shí)現(xiàn)動(dòng)態(tài)二維碼的示例代碼,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02詳談Map的key、value值的數(shù)據(jù)類型不能為基本類型的原因
這篇文章主要介紹了詳談Map的key、value值的數(shù)據(jù)類型不能為基本類型的原因,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09java中Base64字符串出現(xiàn)不合法字符的問題解決
非法的base64數(shù)據(jù)可能導(dǎo)致編碼或解碼過程出錯(cuò),本文主要介紹了java中Base64字符串出現(xiàn)不合法字符的問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06