本文原創,轉載請註明出處! 參考文章: 《“JUC鎖”03之 公平鎖(一)》 《“JUC鎖”03之 公平鎖(二)》 AbstractOwnableSynchronizer,用於供子類存取獨占鎖的所屬線程。 #getExclusiveOwnerThread()/#setExclusiveOwnerTh ...
本文原創,轉載請註明出處!
參考文章:
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()
查看當前線程是否為獨占鎖所屬線程,供子類實現。
操作流程:
共用鎖
相關操作:
- acquireShared(int)
獲取共用鎖。 - acquireSharedInterruptibly(int)
獲取共用鎖,可中斷。 - tryAcquireSharedNanos(int, long):boolean
獲取共用鎖,可中斷,可超時,返回true表示操作成功,false表示操作失敗。 - #tryAcquireShared(int):int
嘗試獲取共用鎖,返回大於或等於0表示可以出隊,否則表示繼續排隊,供子類實現。 - releaseShared(int):boolean
釋放共用鎖,返回是否操作成功。 - #tryReleaseShared(int):boolean
嘗試釋放共用鎖,返回是否可以喚醒下一個線程,供子類實現。 -
Collection<Thread> getSharedQueuedThreads()
返回隊列中需要獲取共用鎖的所有線程。
操作流程:
隊列
相關操作:
- 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)
返回等待目標條件的所有線程