aqs學習
aqs是一個很重要的併發框架,熟悉之後可以很方便的構造自己的併發工具。
aqs核心在於一個acquire方法。
public final void acquire(int arg) {
if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)){
selfInterrupt();
}
}
1.tryAcquire(arg)
獲取鎖,獲取成功直接結束,
獲取失敗,進入2。
2.addWaiter(Node.EXCLUSIVE)
獲取失敗表示有人佔據了鎖,進入等待佇列,處理完成進入3。
3.acquireQueued(node,arg)
返回true會中斷,大部分情況會返回false。
final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {
setHead(node);
p.next = null; // help GC
failed = false;
return interrupted; // 方法出口
}
if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckInterrupt()){
interrupted = true;
}
}
} finally { //異常出口
if (failed)
cancelAcquire(node);
}
}
finally邏輯先無視。
1.p == head
判斷成功走2,不成功走3。
2.tryAcquire(arg)
獲取成功返回,失敗走3。
3.shouldParkAfterFailedAcquire(p, node)
成功走4,不成功回到1。
4.parkAndCheckInterrupt()
成功修改狀態,失敗不修改,然後回到1。
相關文章
- AQS原理學習筆記AQS筆記
- AQS學習(二) AQS互斥模式與ReenterLock可重入鎖原理解析AQS模式
- Java併發之AQS同步器學習JavaAQS
- AQS學習(一)自旋鎖原理介紹(為什麼AQS底層使用自旋鎖佇列?)AQS佇列
- JUC原始碼學習筆記2——AQS共享和Semaphore,CountDownLatch原始碼筆記AQSCountDownLatch
- AQS系列(七)- 終篇:AQS總結AQS
- AQS解析AQS
- ReentrantLock & AQSReentrantLockAQS
- 併發-AQSAQS
- AbstractQueuedSynchronizer(AQS)深入剖析AQS
- AQS原理淺析AQS
- AQS初體驗AQS
- AQS原始碼分析AQS原始碼
- AQS實現原理AQS
- 深入理解AQSAQS
- 深入理解AbstractQueuedSynchronizer(AQS)AQS
- 從ReentrantLock角度解析AQSReentrantLockAQS
- AbstractQueuedSynchronizer(AQS)原始碼解析AQS原始碼
- J.U.C - AQSAQS
- JAVA AQS 實現原理JavaAQS
- AQS原始碼閱讀AQS原始碼
- AQS之ReentrantReadWriteLock寫鎖AQS
- 全網最詳細的AbstractQueuedSynchronizer(AQS)原始碼剖析(一)AQS基礎AQS原始碼
- JDK併發AQS系列(三)JDKAQS
- 難以理解的AQS(上)AQS
- JDK併發AQS系列(五)JDKAQS
- 難以理解的AQS(下)AQS
- JDK併發AQS系列(二)JDKAQS
- 執行緒系列四AQS執行緒AQS
- AQS佇列同步器AQS佇列
- 初識Lock與AbstractQueuedSynchronizer(AQS)AQS
- JDK併發AQS系列(一)JDKAQS
- java併發神器 AQS(AbstractQueuedSynchronizer)JavaAQS
- JUC(3)---CountDownLatch、CyclicBarrier和AQSCountDownLatchAQS
- Lock鎖相關以及AQSAQS
- 【一知半解】AQSAQS
- 深度學習——學習目錄——學習中……深度學習
- 一文帶你學會AQS和併發工具類的關係AQS