日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

队列同步器 AbstractQueuedSynchronizer

發布時間:2023/12/20 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 队列同步器 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。