多線程條件通行工具——AbstractQueuedSynchronizer,synchronizer
本文原創,轉載請注明出處!
參考文章:
《“JUC鎖”03之 公平鎖(一)》
《“JUC鎖”03之 公平鎖(二)》
AbstractOwnableSynchronizer,用於供子類存取獨占鎖的所屬線程。
- #getExclusiveOwnerThread()/#setExclusiveOwnerThread(Thread):獲取/設置獨占鎖的所屬線程。
AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer,用於操縱獨占鎖與共享鎖,由子類提供線程獲取鎖與釋放鎖的策略,制定線程通行的條件。前者是操縱int,後者是操縱long。
狀態
state由子類來賦於具體意義,可以作為一個鎖的狀態或其它意義。
- #getState():int
獲取狀態。
- #setState(int)
設置狀態。
- #compareAndSetState(int, int):boolean
嘗試設置狀態,返回是否設置成功。
獨占鎖
相關操作:
- acquire(int)
獲取獨占鎖。
- acquireInterruptibly(int)
獲取獨占鎖,可中斷。
- tryAcquireNanos(int, long):boolean
獲取獨占鎖,可中斷,可超時,返回true表示操作成功,false表示操作失敗。
- #tryAcquire(int):boolean
嘗試獲取獨占鎖,返回是否可以出隊還是繼續排隊,供子類實現。
- release(int):boolean
釋放獨占鎖,返回是否操作成功。
- #tryRelease(int):boolean
嘗試釋放獨占鎖,返回是否可以喚醒下一個線程,供子類實現。
- Collection<Thread> getExclusiveQueuedThreads()
返回隊列中需要獲取獨占鎖的所有線程。
- #boolean isHeldExclusively()
查看當前線程是否為獨占鎖所屬線程,供子類實現。
操作流程:
共享鎖
相關操作:
操作流程:
隊列
相關操作:
- int getQueueLength()
返回隊列的長度
- boolean hasQueuedThreads()
返回隊列中是否有線程
- Collection<Thread> getQueuedThreads()
返回隊列中所有線程
- Collection<Thread> getExclusiveQueuedThreads()
返回隊列中需要獲取獨占鎖的所有線程
- Collection<Thread> getSharedQueuedThreads()
返回隊列中需要獲取共享鎖的所有線程
- boolean isQueued(Thread)
查看指定線程是否位於隊列中
- boolean hasQueuedPredecessors()
返回當前線程是否不位於隊頭,一般公平策略的子類需要使用到這個方法。
- Thread getFirstQueuedThread()
返回排於隊頭的線程。
- boolean hasContended()
查看是否曾經有線程入過隊
條件
ConditionObject是一個內部類,其實現接口是Condition,供子類實現時選擇是否提供創建。
相關操作:
- boolean owns(ConditionObject)
查看目標條件對象是否所屬該AbstractQueuedSynchronizer對象
- boolean hasWaiters(ConditionObject)
查看是否有等待目標條件的線程
- int getWaitingThreads(ConditionObject)
查看等待目標條件的線程數量
- Collection<Thread> getWaitQueueLength(ConditionObject)
返回等待目標條件的所有線程