跑起一個程式,并不難;難的是,能讓程式跑多遠!—— 一顆剽悍的種子

JUC并發系列
JUC并發系列(一):什么?聽說你搞混了并發和并行
JUC并發系列(二):詳解Condition實作精準通知喚醒
JUC并發系列(三):面試問并發,一問鎖就懵(怒肝一篇透徹理解鎖,面試不慌)
JUC并發系列(四):【面試常問】多種方法解決ArrayList非執行緒安全,詳解CopyOnWriteArrayList
JUC并發系列(五):CopyOnWriteArraySet解決HashSet非執行緒安全
JUC并發系列(六):ConcurrentHashMap解決HashMap非執行緒安全
JUC并發系列(七):觸及Callable
JUC并發系列(八):并發編程常用輔助類CountDownLatch與CyclicBarrier
系列八展開了并發編程常用輔助類CountDownLatch和CyclicBarrier,其實還有第三個常用輔助類Semaphore,
JUC并發系列(八):并發編程常用輔助類CountDownLatch與CyclicBarrier
一、什么是 Semaphore?
Semaphore 信號量,用來控制同時訪問資源的執行緒數,可以通過協調各個執行緒確保合理使用資源,
二、應用場景
Semaphore用于多個公共共享資源互斥,以及有限公用資源流量控制的運用,
三、舉一個栗子
舉一個現實當中我們上廁所的例子,例如房子里只有兩間廁所,那么就只允許同時有兩個人進去使用,其他人都必須在廁所外等待,所以前兩人會先使用廁所,后面的人看到廁所關著門有人使用,也就不能再使用;但是前兩人一旦有一人已經離開廁所,那么后面就允許有一人進去使用,
這個例子的人是執行緒,而廁所關著有人使用表示執行緒在執行,離開廁所表示執行緒執行完成;看到廁所關著有人使用表示執行緒阻塞,不能執行,
四、關鍵代碼
跟我們講CountDownLatch和CyclicBarrier的count同樣放的是執行緒數量,不同的是這里count用的是 限流,
Semaphore semphore = new Semaphore(int count);
acquire() 獲取到信號量,當信號量滿時就等待,直到釋放,
semphore.acquire();
release() 釋放信號量,將信號量釋放,然后喚醒等待的執行緒,
semphore.release();
五、手敲代碼示例
看完上面的例子我們來實踐一下,還是兩間廁所,有6個人需要使用,
public class Demo{
public static void main(String[] args) {
Semaphore semphore = new Semaphore(2);
for (int i = 1; i <= 6; i++) {
new Thread(()->{
try {
semphore.acquire();
System.out.println(Thread.currentThread().getName() + "進廁所");
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName() + "離開廁所");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semphore.release();
}
}).start();
}
}
}
六、運行結果
可以看到只有在 Semaphore 規定的執行緒數量下有秩序的執行,

七、最后
最后的最后,為了更好的閱讀體驗,我把想說的話都放在了下面,嘿嘿,
我是一顆剽悍的種子 把我會的,認真的分享 是我寫博客一直不變的信條,
如果你能看到這篇博文,說明咱們還是很有緣的;希望能帶給你一些許幫助,創作的不易, 把我文章的知識帶走,你的三連留下,點贊,評論,關注,是我最大的動力,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/156620.html
標籤:python
上一篇:BCIduino|外骨骼通信協議
