使用[github主頁](
重入鎖,標識在乙個執行緒中,可重複對該資源重複加鎖。
針對於aqs實現重入功能在重寫tryaquires***的時候考慮同乙個執行緒多次lock的情況即可
偽**
thread currentthread = thread.currentthread();
//getexclusiveownerthread() 標識獨佔模式下的當前執行緒物件引用
if(currentthread == getexclusiveownerthread())
protected final boolean tryrelease(int releases)
//這裡,就是當前執行緒獲取了多次
//比如1.lock() 2.lock() 3.unlock() 4.unlock
//這裡reentrantlock的aquire()方法傳入的是1
//執行1,2後state分別是 1,2
//執行3 c = 2-1 //setstate(2-1)
//執行4 c = 1-1 //直接釋放
setstate(c);
return free;
}
node鍊錶 head–>n1(pre,next)–>n2(pre,next)
//true 標識在佇列中的該執行緒擁有前置節點
//false 該執行緒是head或者 null==null即空佇列 tail==head==null
public final boolean hasqueuedpredecessors()
protected final boolean tryacquire(int acquires)
}else if (current == getexclusiveownerthread())
return false;
}
公平鎖最終獲得鎖的順序和佇列中的順序是一致的,fifo
為什麼?
aqs操作雖然使用cas無鎖操作機制,但是,cpu在排程的時候,切換至該執行緒的時候,該執行緒去獲取該資源鎖,但是fifo原則,無法獲取鎖,將處於自旋操作,後續執行緒任務無法執行,cpu排程結束,就切換至下乙個執行緒。
公平鎖大大的增加了cpu執行緒排程次數,導致吞吐率(tps)降低
/**
* describe:
* e-mail:[email protected] date:2018/12/16
* * @since 0.0.1
*/public
class
reentrantlocktest
@override
public
void
run(
)catch
(exception e)
finally}}
public
static
void
main
(string[
] args)
system.out.
println
(null == null);}
}
不公平鎖
公平鎖Java 高併發程式設計 重入鎖 面試題
public class reentrantlock5 extends threadfinally public static void main string args reentrantlock還可以指定為公平鎖什麼是公平鎖,什麼是不公平鎖,假設很多個執行緒訪問同乙份資源的時候都要鎖定,其中某乙...
可重入鎖 不可重入鎖
可重入鎖指的是可重複可遞迴呼叫的鎖,在外層使用鎖之後,在內層仍然可以使用,並且不發生死鎖 前提是同乙個物件或者類 note reentrantlock和synchronized都是可重入鎖 1 public class testlock 78 public synchronized void tes...
java重入鎖 公平鎖和非公平鎖
鎖的重入是指同乙個執行緒可以多次獲取同乙個鎖,synchronize是隱式的可重入鎖,reentrantlock通過 實現了鎖的重入 final boolean nofairtryacquire int acquires else if current getexclusiveownerthread...