队列同步器 AbstractQueuedSynchronizer
生活随笔
收集整理的這篇文章主要介紹了
队列同步器 AbstractQueuedSynchronizer
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
隊列同步器? AbstractQueuedSynchronizer,是用來構建鎖或者其他同步組件的基礎框架,它使用了一個int成員變量,通過內置的FIFO隊列來完成資源獲取線程的排隊工作。
同步器的主要使用方式是繼承,子類通過繼承同步器并實現它的抽象方法來管理同步狀態。
同步器是實現鎖(任意同步組件)的的關鍵,在鎖的實現中聚合同步器,利用同步器實現鎖的語義。
同步器的設計是基于模板方法模式的,也就是說,使用者需要繼承同步器并重寫指定的方法,隨后將同步器組合在自定義同步組件的實現中,并調用同步器提供的模板方法,而這些模板方法將會調用使用者重寫的方法。getState()、setState(int newState)、compareAndSetState(int expect, int update)。
下面,通過獨占鎖的示例來深入了解同步器的工作原理:
1 class Mutex implements Lock{ 2 //靜態內部類,自定義同步器 3 private static class Sync extends AbstractQueuedSynchronizer{ 4 //是否處于占用狀態 5 protected boolean isHeldExclusively(){ 6 return getState() == 1; 7 } 8 //當狀態為0的時候獲取鎖 9 public boolean tryAcquire(int acquires){ 10 if (compareAndSetState(0,1)){ 11 setExclusiveOwnerThread(Thread.currentThread());//設置當前擁有獨占訪問的線程。null 參數表示沒有線程擁有訪問。 12 return true; 13 } 14 return false; 15 } 16 //釋放鎖,將狀態設置為0 17 protected boolean tryRelease(int releases){ 18 if (getState() == 0) throw new IllegalMonitorStateException(); 19 setExclusiveOwnerThread(null); 20 setState(0); 21 return true; 22 } 23 //返回一個Condition,每個condition都包含了一個condition隊列 24 Condition newCondition(){return new ConditionObject();} 25 } 26 //僅需要將操作代理到Sync上即可 27 private final Sync sync = new Sync(); 28 public void lock(){sync.acquire(1);}// 以獨占模式獲取對象,忽略中斷。 29 public boolean tryLock(){return sync.tryAcquire(1);} 30 public void unlock(){sync.release(1);} 31 public Condition newCondition(){return sync.newCondition();} 32 public boolean isLocked(){return sync.isHeldExclusively();} 33 public boolean hasQueuedThreads(){return sync.hasQueuedThreads();} 34 public void lockInterruptibly() throws InterruptedException{ 35 sync.acquireInterruptibly(1); 36 } 37 public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException{ 38 return sync.tryAcquireNanos(1,unit.toNanos(timeout)); 39 } 40 }?
轉載于:https://www.cnblogs.com/xcyz/p/8023492.html
總結
以上是生活随笔為你收集整理的队列同步器 AbstractQueuedSynchronizer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql基础知识点
- 下一篇: word文档下划线无法显示的解决方法