### AQS與ReentrantLock的關聯
從架構圖中可以得知,AQS提供了大量用于自定義同步器實現的Protected方法。自定義同步器實現的相關方法也只是為了通過修改State字段來實現多線程的獨占模式或者共享模式。自定義同步器需要實現以下方法(ReentrantLock需要實現的方法如下,并不是全部):
| 方法名 | 描述 |
| --- | --- |
| protected boolean isHeldExclusively() | 該線程是否正在獨占資源。只有用到Condition才需要去實現它。 |
| protected boolean tryAcquire(int arg) | 獨占方式。arg為獲取鎖的次數,嘗試獲取資源,成功則返回True,失敗則返回False。 |
| protected boolean tryRelease(int arg) | 獨占方式。arg為釋放鎖的次數,嘗試釋放資源,成功則返回True,失敗則返回False。 |
| protected int tryAcquireShared(int arg) | 共享方式。arg為獲取鎖的次數,嘗試獲取資源。負數表示失敗;0表示成功,但沒有剩余可用資源;正數表示成功,且有剩余資源。 |
| protected boolean tryReleaseShared(int arg) | 共享方式。arg為釋放鎖的次數,嘗試釋放資源,如果釋放后允許喚醒后續等待結點返回True,否則返回False。 |
一般來說,自定義同步器要么是獨占方式,要么是共享方式,它們也只需實現tryAcquire-tryRelease、tryAcquireShared-tryReleaseShared中的一種即可。AQS也支持自定義同步器同時實現獨占和共享兩種方式,如ReentrantReadWriteLock。ReentrantLock是獨占鎖,所以實現了tryAcquire-tryRelease。
以非公平鎖為例,這里主要闡述一下非公平鎖與AQS之間方法的關聯之處,具體每一處核心方法的作用會在文章后面詳細進行闡述

以非公平鎖為例,我們將加鎖和解鎖的交互流程單獨拎出來強調一下,以便于對后續內容的理解

加鎖:
* 通過ReentrantLock的加鎖方法Lock進行加鎖操作。
* 會調用到內部類Sync的Lock方法,由于Sync#lock是抽象方法,根據ReentrantLock初始化選擇的公平鎖和非公平鎖,執行相關內部類的Lock方法,本質上都會執行AQS的Acquire方法。
* AQS的Acquire方法會執行tryAcquire方法,但是由于tryAcquire需要自定義同步器實現,因此執行了ReentrantLock中的tryAcquire方法,由于ReentrantLock是通過公平鎖和非公平鎖內部類實現的tryAcquire方法,因此會根據鎖類型不同,執行不同的tryAcquire。
* tryAcquire是獲取鎖邏輯,獲取失敗后,會執行框架AQS的后續邏輯,跟ReentrantLock自定義同步器無關。
解鎖:
* 通過ReentrantLock的解鎖方法Unlock進行解鎖。
* Unlock會調用內部類Sync的Release方法,該方法繼承于AQS。
* Release中會調用tryRelease方法,tryRelease需要自定義同步器實現,tryRelease只在ReentrantLock中的Sync實現,因此可以看出,釋放鎖的過程,并不區分是否為公平鎖。
* 釋放成功后,所有處理由AQS框架完成,與自定義同步器無關。
通過上面的描述,大概可以總結出ReentrantLock加鎖解鎖時API層核心方法的映射關系

- 簡介
- 概述
- 進程vs線程
- 資源限制
- 有關并行的兩個定律
- 線程同步和阻塞
- 線程阻塞
- 線程的特性
- 守護線程
- 線程異常
- Thread
- 線程狀態
- 線程中斷
- wait¬ify
- suspend&resume
- join&yield
- notify¬ifyAll
- Thread.sleep
- 線程任務
- Runnable
- Callable
- Future模式
- FutureTask
- 線程實現方式
- 內核線程實現
- 用戶線程實現
- 混合實現
- Java線程的實現
- java與協程
- 纖程-Fiber
- 線程調度
- 多線程協作方式
- 阻塞
- 放棄
- 休眠
- 連接線程
- 線程估算公式
- 線程活躍性
- 死鎖
- 線程安全性
- 對象的發布與逸出
- 構造方法溢出
- 線程封閉
- 對象的可變性
- 原子性
- 原子操作
- CPU原子操作原理
- 總線鎖
- 緩存鎖
- JAVA如何實現原子操作
- long和double讀寫操作原子性
- Adder和Accumulator
- 線程性能
- 同步工具類
- 閉鎖
- CountDownLatch
- FutureTask
- 信號量
- 柵欄
- CyclicBarrier
- Exchanger
- 并發編程
- volatile
- synchronized
- 無鎖
- 偏向鎖
- 輕量級鎖
- 鎖的優缺點對比
- 鎖升級
- 鎖消除
- Monitor
- synchronized語法
- Mutex Lock
- synchronized實踐問題
- synchronized&ReentrantLock
- Lock
- ReentrantLock
- Condition
- 讀寫鎖
- ReadWriteLock
- StampedLock
- 線程池
- Executor
- ExecutorService
- Executors
- ThreadPoolExecutor
- RejectedExecutionHandler
- ThreadFactory
- 線程池大小公式
- 動態調整線程池大小
- Fork/Join框架
- ForkJoinPool
- CompletableFuture
- JUC并發工具包
- LockSupport
- 延時任務與周期任務
- Timer
- TimerTask
- 異構任務并行化
- CompletionService
- volatile和synchronized比較
- 鎖優化
- 鎖相關概念
- 悲觀鎖(排它鎖)
- 樂觀鎖
- 自旋鎖
- 樂觀鎖vs悲觀鎖
- JVM鎖優化-鎖消除
- ThreadLocal
- InheritableThreadLocal
- TransmittableThreadLocal
- ThreadLocalRandom
- 無鎖
- AtomicInteger
- Unsafe
- AtomicReference
- AtomicStampedReference
- AtomicIntegerArray
- AtomicIntegerFieldUpdater
- 無鎖Vector
- LongAdder
- LongAccumulator
- 常見鎖類型
- 悲觀鎖&獨占鎖
- 樂觀鎖
- 樂觀鎖vs悲觀鎖
- 自旋鎖vs適應性自旋鎖
- 公平鎖vs非公平鎖
- 可重入鎖vs非可重入鎖
- 獨享鎖vs共享鎖
- 互斥鎖
- CAS
- AQS介紹
- AQS深入剖析
- AQS框架
- AQS核心思想
- AQS數據結構
- 同步狀態State
- ReentrantLock vs AQS
- AQS與ReentrantLock的關聯
- ReentrantLock具體實現
- 線程加入等待隊列
- 等待隊列中線程出隊列時機
- 如何解鎖
- 中斷恢復后的執行流程
- ReentrantLock的可重入應用
- JUC中的應用場景
- 自定義同步工具
- CLH鎖
- 并發框架
- Akka
- Disruptor-無鎖緩存框架
- 常見面試題
- 兩個線程交替打印A和B
- 附錄