java非公平鎖知識點(diǎn)實(shí)例詳解
1、非公平鎖不能保證鎖的獲取是按照請求鎖的順序進(jìn)行的。這可能會導(dǎo)致某個或某些線程永遠(yuǎn)得不到鎖。
2、CPU喚醒線程的費(fèi)用可以降低,整體吞吐效率會很高。但是可能會有線程長時間甚至永遠(yuǎn)得不到鎖,導(dǎo)致餓死。
實(shí)例
/**
* Sync object for non-fair locks
*/
static final class NonfairSync extends Sync {
private static final long serialVersionUID = 7316153563782823691L;
/**
* Performs lock. Try immediate barge, backing up to normal
* acquire on failure.
*/
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
protected final boolean tryAcquire(int acquires) {
return nonfairTryAcquire(acquires);
}
}
/**
* Sync object for fair locks
*/
static final class FairSync extends Sync {
private static final long serialVersionUID = -3000897897090466540L;
final void lock() {
acquire(1);
}
/**
* 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;
}
}
知識點(diǎn)擴(kuò)展:
非公平鎖,顧名思義,各個線程獲取到鎖的順序,不一定和它們申請的先后順序一致,有可能后來的線程,反而先獲取到了鎖。
在實(shí)現(xiàn)上,公平鎖在進(jìn)行l(wèi)ock時,首先會進(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時,會直接嘗試進(jìn)行加鎖,如果成功,則獲取到鎖,如果失敗,則進(jìn)行和公平鎖相同的動作。
到此這篇關(guān)于java非公平鎖知識點(diǎn)實(shí)例詳解的文章就介紹到這了,更多相關(guān)java非公平鎖如何理解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java程序員的10道常見的XML面試問答題(XML術(shù)語詳解)
包括web開發(fā)人員的Java面試在內(nèi)的各種面試中,XML面試題在各種編程工作的面試中很常見。XML是一種成熟的技術(shù),經(jīng)常作為從一個平臺到其他平臺傳輸數(shù)據(jù)的標(biāo)準(zhǔn)2014-04-04
Java中的while無限循環(huán)結(jié)構(gòu)及實(shí)例
這篇文章主要介紹了Java中的while無限循環(huán)結(jié)構(gòu)及實(shí)例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
SpringBoot+Vue靜態(tài)資源刷新后無法訪問的問題解決方案
這篇文章主要介紹了SpringBoot+Vue靜態(tài)資源刷新后無法訪問的問題解決方案,文中通過代碼示例和圖文講解的非常詳細(xì),對大家解決問題有一定的幫助,需要的朋友可以參考下2024-05-05
idea微服務(wù)項(xiàng)目服務(wù)如何顯示在同一窗口
本文介紹了如何在微服務(wù)項(xiàng)目導(dǎo)入時將所有服務(wù)加入同一窗口中,解決啟動項(xiàng)目服務(wù)時顯示不全的問題,通過點(diǎn)擊左上角的View,選擇ToolWindows,然后選擇Services,使用快捷鍵Alt+8,選擇Spring Boot,就可以將所有服務(wù)加到同一窗口中2025-02-02
SpringBoot多數(shù)據(jù)源配置并通過注解實(shí)現(xiàn)動態(tài)切換數(shù)據(jù)源
本文主要介紹了SpringBoot多數(shù)據(jù)源配置并通過注解實(shí)現(xiàn)動態(tài)切換數(shù)據(jù)源,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Java的IO流實(shí)現(xiàn)文件和文件夾的復(fù)制
這篇文章主要為大家詳細(xì)介紹了Java的IO流實(shí)現(xiàn)文件和文件夾的復(fù)制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06
Java從控制臺讀入數(shù)據(jù)的幾種方法總結(jié)
下面小編就為大家?guī)硪黄狫ava從控制臺讀入數(shù)據(jù)的幾種方法總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10
mybatis update set 多個字段實(shí)例
這篇文章主要介紹了mybatis update set 多個字段實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01

