久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java并發(fā)編程之Semaphore的使用簡(jiǎn)介

瀏覽:106日期:2022-08-14 10:14:33
簡(jiǎn)介

Semaphore是用來(lái)限制訪問(wèn)特定資源的并發(fā)線程的數(shù)量,相對(duì)于內(nèi)置鎖synchronized和重入鎖ReentrantLock的互斥性來(lái)說(shuō),Semaphore可以允許多個(gè)線程同時(shí)訪問(wèn)共享資源。

Semaphored的使用構(gòu)造方法

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

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

核心方法

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

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

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

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

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

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

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

示例

總共有5個(gè)許可證,最先獲取到許可證的5個(gè)線程開始執(zhí)行任務(wù),沒(méi)獲取到的線程進(jìn)入等待狀態(tài),直到獲取到許可證的線程釋放許可證后,再獲取許可證執(zhí)行任務(wù)。

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

使用Semaphore實(shí)現(xiàn)互斥只需要將許可證數(shù)量設(shè)置為1,這樣就可以保證只有一個(gè)線程能獲取到許可證。

Semaphore semaphore = new Semaphore(1);

相比內(nèi)置鎖synchronized和重入鎖ReentrantLock,使用Semaphore實(shí)現(xiàn)互斥有個(gè)明顯的缺點(diǎn):不可重入,沒(méi)有釋放許可證的情況下,再次調(diào)acquire方法將導(dǎo)致死鎖。

示例:

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

“執(zhí)行任務(wù)B”永遠(yuǎn)不會(huì)打印,因?yàn)樵S可證只有一個(gè),第二次acquire方法的調(diào)用會(huì)因?yàn)闊o(wú)法獲取到許可證而一直阻塞。

以上就是Java并發(fā)編程之Semaphore的使用簡(jiǎn)介的詳細(xì)內(nèi)容,更多關(guān)于Java并發(fā)編程之Semaphore的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 一区二区不卡 | 毛片a片 | 国产一级大片 | 久久精品国产亚洲 | 一区二区在线免费观看 | 精品亚洲成a人片在线观看 国产高清在线 | 日韩精品一区二区三区视频播放 | 欧美人牲 | 久久tv在线观看 | 久久国产亚洲精品 | 黄色片免费在线 | 中文字幕在线免费 | 犬夜叉在线观看 | 色久视频| 欧美成人一区二区三区片免费 | 九九热精品视频 | 九九综合九九 | www.蜜桃av| 91精品国产综合久久婷婷香蕉 | 日本中文字幕一区二区 | 亚洲视频在线观看一区二区三区 | www国产亚洲精品久久网站 | 欧美色图另类 | 久久蜜桃精品一区二区三区综合网 | 男人天堂网址 | 久久av黄色 | www.9191| 狠狠综合久久av一区二区老牛 | 97国产一区二区精品久久呦 | 日韩在线免费 | 日韩一区二 | 免费在线黄色电影 | 国产一级一级毛片女人精品 | 一区自拍 | 亚洲成人自拍 | 欧美一区久久 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 狠狠干av | 黄色一级毛片在线观看 | 成人18视频在线观看 | av免费网站 |