Java并發(fā)編程之Semaphore的使用簡(jiǎn)介
簡(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è)線程開(kāi)始執(zhí)行任務(wù),沒(méi)獲取到的線程進(jìn)入等待狀態(tài),直到獲取到許可證的線程釋放許可證后,再獲取許可證執(zhí)行任務(wù)。
public class Demo {
public static void main(String[] args) {
//創(chuàng)建許可證數(shù)量為5的Semaphore
Semaphore 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();
}
}
/* 開(kāi)始輸出:
* 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)注腳本之家其它相關(guān)文章!
- Java信號(hào)量Semaphore原理及代碼實(shí)例
- java并發(fā)編程專題(六)----淺析(JUC)Semaphore
- Java 信號(hào)量Semaphore的實(shí)現(xiàn)
- 通俗易懂學(xué)習(xí)java并發(fā)工具類-Semaphore,Exchanger
- Java并發(fā)系列之Semaphore源碼分析
- Java并發(fā)編程:CountDownLatch與CyclicBarrier和Semaphore的實(shí)例詳解
- Java并發(fā)編程之Semaphore(信號(hào)量)詳解及實(shí)例
- JAVA 多線程之信號(hào)量(Semaphore)實(shí)例詳解
- java線程并發(fā)semaphore類示例
- Java并發(fā)編程之工具類Semaphore的使用
相關(guān)文章
通過(guò)Java帶你了解網(wǎng)絡(luò)IO模型
這篇文章將通過(guò)Java帶大家了解網(wǎng)絡(luò)IO模型,包括BIO,NoBlockingIO,NIO(NewIO),AIO等做了詳細(xì)得介紹,感興趣的小伙伴可以參考閱讀本文2023-05-05
Spring Cloud構(gòu)建Eureka應(yīng)用的方法
這篇文章主要介紹了Spring Cloud構(gòu)建Eureka應(yīng)用的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Java關(guān)鍵字synchronized原理與鎖的狀態(tài)詳解
在Java當(dāng)中synchronized關(guān)鍵字通常是用來(lái)標(biāo)記一個(gè)方法或者代碼塊。本文將通過(guò)示例為大家詳細(xì)介紹一下Synchronized的各種使用方法,需要的可以參考一下2022-08-08
java_IO向文件中寫入和讀取內(nèi)容代碼實(shí)例
這篇文章主要介紹了java_IO向文件中寫入和讀取內(nèi)容,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
java中break和continue區(qū)別及使用場(chǎng)合分析
本文力圖通過(guò)實(shí)例加使用場(chǎng)合詳解來(lái)引導(dǎo)菜鳥(niǎo)重新認(rèn)識(shí)break和continue語(yǔ)句,需要的朋友可以參考下2014-01-01

