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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Semaphore源码分析

發布時間:2024/4/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Semaphore源码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

從Semaphore的功能來看,我們基本能猜測到它的底層實現一定是基于AQS的共享所,因為需要實現多個線程共享一個領排池

創建?Semaphore?實例的時候,需要一個參數?permits,這個基本上可以確定是設置給?AQS?的?state?的,然后每個線程調用?acquire?的時候,執行?state = state?-?1,release?的時候執行?state = state + 1,當然,acquire?的時候,如果?state = 0,說明沒有資源了,需要等待其他線程
release。

Semaphore分公平策略和非公平策略

FairSync

static final class FairSync extends Sync { private static final long serialVersionUID = 2014338818796000944L; FairSync(int permits) { super(permits); } protected int tryAcquireShared(int acquires) { for (;;) { // 區別就在于是不是會先判斷是否有線程在排隊,然后才進行 CAS 減操作 if (hasQueuedPredecessors()) return -1; int available = getState(); int remaining = available - acquires; if (remaining < 0 || compareAndSetState(available, remaining)) return remaining; } } }

NofairSync

通過對比發現公平和非公平的區別就在于是否多了一個hasQueuedPredecessors的判斷

static final class NonfairSync extends Sync { private static final long serialVersionUID = -2694183684443567898L; NonfairSync(int permits) { super(permits); } protected int tryAcquireShared(int acquires) { return nonfairTryAcquireShared(acquires); } } final int nonfairTryAcquireShared(int acquires) { for (;;) { int available = getState(); int remaining = available - acquires; if (remaining < 0 || compareAndSetState(available, remaining)) return remaining; } }

由于后面的代碼和CountDownLatch的是完全一樣,都是基于共享鎖的實現,所以也就沒必要再花時間來分析了。

?

總結

以上是生活随笔為你收集整理的Semaphore源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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