java 并发编程 aqs_Java并发编程之AQS
一、什么是AQS
AQS(AbstractQueuedSynchronize:隊列同步器)是用來構建鎖或者其他同步組件的基礎框架,很多同步類都是在它的基礎上實現的,比如常用的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore。
二、實現原理
在AQS內部,定義了一個 volatile int state 變量來標識同步狀態,通過改變state的狀態來控制對共享資源的訪問,根據不同的實現,state可以表示不同的狀態,例如:在?ReentrantLock中它表示擁有該鎖的線程請求了多少次該鎖;在?Semaphore 中表示剩余的許可數,在?FutureTask中表示任務的狀態(尚未開始、運行、完成和取消)。同時定義了一個 FIFO 隊列維護爭用資源時被阻塞的線程,當線程嘗試獲取鎖時,如果鎖已經被占用,那么該線程就會被構造成一個Node節點放到同步隊列的尾部;隊列的頭節點是成功獲取鎖的節點,當頭節點線程釋放鎖時,會喚醒后面的節點并釋放當前頭節點的引用。
AQS主要通過繼承的方式來使用,子類通過繼承AQS并實現它的抽象方法來定義state變量的具體的訪問規則,從而可以實現不同類型的同步組件。AQS定義了兩種資源共享的方式:獨占式和共享式。
獨占式:同時只有一個線程能訪問該共享資源。
共享式:多個線程可以同時訪問該共享資源。
AQS中可重寫的方法如下:
protected boolean tryAcquire(int arg):獨占式獲取同步狀態,成功則返回true,失敗則返回false。先查詢同步狀態并判斷同步狀態是否符合預期,然后再進行CAS設置同步狀態。
protected boolean tryRelease(int arg):獨占式釋放同步狀態,成功則返回true,失敗則返回false。等待獲取同步狀態的線程將有機會獲取同步狀態。
protected int tryAcquireShared(int arg):共享式獲取同步狀態,返回大于等于0的值,表示成功,該值表示剩余可用資源數,小于0則表示獲取失敗。
protected boolean tryReleaseShared(int arg):共享式釋放同步狀態,如果釋放后允許喚醒后續等待結點返回true,否則返回false。
protected boolean isHeldExclusively():當前同步器是否在獨占模式下被線程占用,只在 AbstractQueuedSynchronizer.ConditionObject 的方法內進行內部調用,不使用Condition可以不重寫。
AQS自身沒有實現任何同步接口,為了保證對state的訪問修改操作是安全的,重寫AQS指定的方法時,需要使用它提供的如下3個方法來訪問或修改同步狀態:
getState():獲取當前同步狀態。
setState(int newState):設置當前同步狀態。
compareAndSetState(int expect,int update):使用CAS設置當前狀態,該方法能夠保證狀態設置的原子性。
AQS是實現鎖(同步組件)的關鍵,它在底層對同步狀態管理、線程的排隊、等待與喚醒做了實現,簡化鎖的實現。AQS是基于模板方法模式設計的,使用時需要繼承AQS并重寫對應的方法,再將其組合在同步組件中,當使用同步組件訪問共享資源時,調用AQS提供的模板方法,然后模板方法會調用重寫的方法。
原文:https://www.cnblogs.com/Mr-XiaoLiu/p/9985408.html
總結
以上是生活随笔為你收集整理的java 并发编程 aqs_Java并发编程之AQS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java nei_NEI 接口管理平台
- 下一篇: 没网怎么用u盘安装驱动程序 如何在没有网