程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 多線程條件通行工具——AbstractQueuedSynchronizer,synchronizer

多線程條件通行工具——AbstractQueuedSynchronizer,synchronizer

編輯:JAVA綜合教程

多線程條件通行工具——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()
    查看當前線程是否為獨占鎖所屬線程,供子類實現。

操作流程:

 

共享鎖

相關操作:

  • 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)
    返回等待目標條件的所有線程

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved