队列同步器 AbstractQueuedSynchronizer
生活随笔
收集整理的這篇文章主要介紹了
队列同步器 AbstractQueuedSynchronizer
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
隊(duì)列同步器? AbstractQueuedSynchronizer,是用來構(gòu)建鎖或者其他同步組件的基礎(chǔ)框架,它使用了一個(gè)int成員變量,通過內(nèi)置的FIFO隊(duì)列來完成資源獲取線程的排隊(duì)工作。
同步器的主要使用方式是繼承,子類通過繼承同步器并實(shí)現(xiàn)它的抽象方法來管理同步狀態(tài)。
同步器是實(shí)現(xiàn)鎖(任意同步組件)的的關(guān)鍵,在鎖的實(shí)現(xiàn)中聚合同步器,利用同步器實(shí)現(xiàn)鎖的語義。
同步器的設(shè)計(jì)是基于模板方法模式的,也就是說,使用者需要繼承同步器并重寫指定的方法,隨后將同步器組合在自定義同步組件的實(shí)現(xiàn)中,并調(diào)用同步器提供的模板方法,而這些模板方法將會(huì)調(diào)用使用者重寫的方法。getState()、setState(int newState)、compareAndSetState(int expect, int update)。
下面,通過獨(dú)占鎖的示例來深入了解同步器的工作原理:
1 class Mutex implements Lock{ 2 //靜態(tài)內(nèi)部類,自定義同步器 3 private static class Sync extends AbstractQueuedSynchronizer{ 4 //是否處于占用狀態(tài) 5 protected boolean isHeldExclusively(){ 6 return getState() == 1; 7 } 8 //當(dāng)狀態(tài)為0的時(shí)候獲取鎖 9 public boolean tryAcquire(int acquires){ 10 if (compareAndSetState(0,1)){ 11 setExclusiveOwnerThread(Thread.currentThread());//設(shè)置當(dāng)前擁有獨(dú)占訪問的線程。null 參數(shù)表示沒有線程擁有訪問。 12 return true; 13 } 14 return false; 15 } 16 //釋放鎖,將狀態(tài)設(shè)置為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 //返回一個(gè)Condition,每個(gè)condition都包含了一個(gè)condition隊(duì)列 24 Condition newCondition(){return new ConditionObject();} 25 } 26 //僅需要將操作代理到Sync上即可 27 private final Sync sync = new Sync(); 28 public void lock(){sync.acquire(1);}// 以獨(dú)占模式獲取對(duì)象,忽略中斷。 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 }?
轉(zhuǎn)載于:https://www.cnblogs.com/xcyz/p/8023492.html
總結(jié)
以上是生活随笔為你收集整理的队列同步器 AbstractQueuedSynchronizer的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql基础知识点
- 下一篇: word文档下划线无法显示的解决方法