AQS是JDK併發工具包下的一個模板類,做爲併發包下的工具工具基礎實現,咱們常常使用的ReentrantLock,CountDownLatch,CyclicBarrier等都是基於它實現的,而且經過它咱們能夠很容易的實現本身的同步機制。bash
做爲JUC中這麼重要的一個類,有些東西仍是要掌握的。數據結構
主要內容:併發
JDK源碼要說原理,首先要提到其內部數據結構。其內部有兩個子類:工具
另外AQS內部有一個state屬性,AQS內部沒有直接去操做state的地方,可是留給了咱們三個方法去操做它。主要用於標記同步器的狀態學習
能提到幾個點,我以爲就OK了:ui
根據上面提到的原理,想要使用AQS這個類:spa
1 編寫一個新類線程
2 重寫AQS的模板方法code
3 利用AQS提供的基礎方法補全模板方法,tryXXX開頭的方法內容,已重入鎖ReentrantLock爲例,比較清晰。cdn
protected final boolean tryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
// c = 0表明沒有線程修改過狀態,那麼嘗試設置同步器的state。若是設置成功標記當前線程持有鎖
if (c == 0) {
if (compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
// 若是當前的線程持有鎖。state + 1
// 不然返回false,表明沒法獲取
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
複製代碼
4 調用AQS提供的方法來使用,三個維度:是否可中斷、是否共享、是否超時
關於AQS幾個Acquire方法的區別:www.jianshu.com/p/c48793646…
簡單來講就是要知道try開頭的方法是要咱們本身實現的。能提到try開頭的方法便可,最好了解AQS內部的方法大體有哪些
常規區別:
再問一句,ReentrantLock提供的不一樣獲取鎖的方式,好比超時獲取,可中斷獲取,在AQS上的體現是什麼呢?
即上面說的利用的是AQS的acquire,acquireInterruptibly,tryAcquireNanos。
至因而否公平的判斷則是根據當前線程前是否仍有節點在等待。
瞭解了AQS的關鍵點以後,代碼並非很複雜,主要知識點:維護雙向鏈表,更新鏈表節點的狀態,Lock.park,線程中斷。
若是本身之後寫模板類,AQS是一個很好的參照品。
其他也沒太多想說的了,源碼不是很複雜,因此沒有貼源碼出來