亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Java并發編程之Semaphore的使用簡介

瀏覽:102日期:2022-08-14 10:14:33
簡介

Semaphore是用來限制訪問特定資源的并發線程的數量,相對于內置鎖synchronized和重入鎖ReentrantLock的互斥性來說,Semaphore可以允許多個線程同時訪問共享資源。

Semaphored的使用構造方法

Semaphore(int permits):創建Semaphore,并指定許可證的數量。(公平策略為非公平)

Semaphore(int permits, boolean fair):創建Semaphore,并指定許可證的數量和公平策略。

核心方法

acquire():從Semaphore中獲取一個許可證,如果獲取不到則阻塞等待,直到其他線程釋放了一個許可證或者當前線程被中斷。

acquire(int permits):從Semaphore中獲取指定數量的許可證,如果獲取不到則阻塞等待,直到其他線程釋放了對應數量的許可證或者當前線程被中斷。

acquireUninterruptibly():從Semaphore中獲取一個許可證,如果獲取不到則阻塞等待,直到其他線程釋放了一個許可證。(不響應中斷)

tryAcquire():嘗試從Semaphore中獲取一個許可證,獲取成功則返回true,獲取失敗則返回false,不會進行等待。(不受公平策略的影響,許可證可用則立即獲得)

tryAcquire(long timeout, TimeUnit unit):嘗試從Semaphore中獲取一個許可證,獲取成功則返回true,獲取失敗則等待指定的時間,直到等待時間結束還是沒有獲取到許可證則返回false。

release():釋放一個許可證。

release(int permits):釋放指定數量的許可證。

示例

總共有5個許可證,最先獲取到許可證的5個線程開始執行任務,沒獲取到的線程進入等待狀態,直到獲取到許可證的線程釋放許可證后,再獲取許可證執行任務。

public class Demo { public static void main(String[] args) {//創建許可證數量為5的SemaphoreSemaphore semaphore = new Semaphore(5);Runnable runnable = () -> { String threadName = Thread.currentThread().getName(); try{//獲取一個許可證semaphore.acquire();System.out.println(threadName + '執行任務...');Thread.sleep(3000); } catch (InterruptedException e) {e.printStackTrace(); } finally {//釋放一個許可證semaphore.release(); }};ExecutorService executorService = Executors.newFixedThreadPool(10);for(int i = 0; i < 10; i++){ executorService.execute(runnable);}executorService.shutdown(); }}/* 開始輸出: * pool-1-thread-1執行任務... * pool-1-thread-5執行任務... * pool-1-thread-6執行任務... * pool-1-thread-7執行任務... * pool-1-thread-3執行任務... * 三秒后輸出: * pool-1-thread-4執行任務... * pool-1-thread-8執行任務... * pool-1-thread-2執行任務... * pool-1-thread-10執行任務... * pool-1-thread-9執行任務... */使用Semaphore實現互斥

使用Semaphore實現互斥只需要將許可證數量設置為1,這樣就可以保證只有一個線程能獲取到許可證。

Semaphore semaphore = new Semaphore(1);

相比內置鎖synchronized和重入鎖ReentrantLock,使用Semaphore實現互斥有個明顯的缺點:不可重入,沒有釋放許可證的情況下,再次調acquire方法將導致死鎖。

示例:

public class Demo { public static void main(String[] args) {Semaphore semaphore = new Semaphore(1);Runnable runnable = () -> { String threadName = Thread.currentThread().getName(); try {//獲取一個許可證semaphore.acquire();System.out.println(threadName + '執行任務A...');semaphore.acquire();System.out.println(threadName + '執行任務B...'); } catch (InterruptedException e) {e.printStackTrace(); } finally {//釋放一個許可證semaphore.release(); }};new Thread(runnable).start(); }}/* * 輸出結果: * Thread-0執行任務A... */

“執行任務B”永遠不會打印,因為許可證只有一個,第二次acquire方法的調用會因為無法獲取到許可證而一直阻塞。

以上就是Java并發編程之Semaphore的使用簡介的詳細內容,更多關于Java并發編程之Semaphore的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 欧美精品久久久久久久影视 | 成人在线免费网站 | 国产成人高清精品免费5388密 | 韩日福利视频 | 成人在线视屏 | 国产成人精品视频免费 | 伊人伊狠亚洲综合影院 | 日韩1区2区3区 | 久久久久久久综合狠狠综合 | 老汉tv永久视频福利在线观看 | pr社萌汁福利视频在线观看 | 亚洲高清视频网站 | 黄色网页免费看 | 欧美网站在线观看 | 岛国福利视频 | 亚洲成人mv | 欧美一级毛片在线观看 | 国产精品日韩 | 高h猛烈做哭bl壮汉受小说 | 伊在人香蕉99久久 | 精品特级一级毛片免费观看 | 黄色短视频免费 | 一级特黄a 大片免费 | 亚洲最大看欧美片网站 | 成年女人在线观看 | 在线播放一区二区三区 | 国产丰满美女做爰 | 夜夜爽日日澡人人 | 天天狠天天透天干天天怕处 | 性夜黄 a 爽免费看 性性影院在线观看 | 在线观看亚洲精品国产 | 青草视频在线观看免费视频 | 亚洲一区三区 | 国产精品一库二库三库 | 韩国十八禁毛片无遮挡 | 91久久亚洲最新一本 | 国产亚洲欧美日韩在线一区 | 中文字幕在线观看不卡 | 国产欧美在线观看一区二区 | 欧美日视频 | 亚洲国产精品欧美综合 |