Java并發(fā)編程之Semaphore的使用簡介
簡介
Semaphore是用來限制訪問特定資源的并發(fā)線程的數(shù)量,相對于內(nèi)置鎖synchronized和重入鎖ReentrantLock的互斥性來說,Semaphore可以允許多個線程同時訪問共享資源。
Semaphored的使用
構(gòu)造方法
Semaphore(int permits):創(chuàng)建Semaphore,并指定許可證的數(shù)量。(公平策略為非公平)
Semaphore(int permits, boolean fair):創(chuàng)建Semaphore,并指定許可證的數(shù)量和公平策略。
核心方法
acquire():從Semaphore中獲取一個許可證,如果獲取不到則阻塞等待,直到其他線程釋放了一個許可證或者當(dāng)前線程被中斷。
acquire(int permits):從Semaphore中獲取指定數(shù)量的許可證,如果獲取不到則阻塞等待,直到其他線程釋放了對應(yīng)數(shù)量的許可證或者當(dāng)前線程被中斷。
acquireUninterruptibly():從Semaphore中獲取一個許可證,如果獲取不到則阻塞等待,直到其他線程釋放了一個許可證。(不響應(yīng)中斷)
tryAcquire():嘗試從Semaphore中獲取一個許可證,獲取成功則返回true,獲取失敗則返回false,不會進行等待。(不受公平策略的影響,許可證可用則立即獲得)
tryAcquire(long timeout, TimeUnit unit):嘗試從Semaphore中獲取一個許可證,獲取成功則返回true,獲取失敗則等待指定的時間,直到等待時間結(jié)束還是沒有獲取到許可證則返回false。
release():釋放一個許可證。
release(int permits):釋放指定數(shù)量的許可證。
示例
總共有5個許可證,最先獲取到許可證的5個線程開始執(zhí)行任務(wù),沒獲取到的線程進入等待狀態(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{ //獲取一個許可證 semaphore.acquire(); System.out.println(threadName + "執(zhí)行任務(wù)..."); 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執(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實現(xiàn)互斥
使用Semaphore實現(xiàn)互斥只需要將許可證數(shù)量設(shè)置為1,這樣就可以保證只有一個線程能獲取到許可證。
Semaphore semaphore = new Semaphore(1);
相比內(nèi)置鎖synchronized和重入鎖ReentrantLock,使用Semaphore實現(xiàn)互斥有個明顯的缺點:不可重入,沒有釋放許可證的情況下,再次調(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 { //獲取一個許可證 semaphore.acquire(); System.out.println(threadName + "執(zhí)行任務(wù)A..."); semaphore.acquire(); System.out.println(threadName + "執(zhí)行任務(wù)B..."); } catch (InterruptedException e) { e.printStackTrace(); } finally { //釋放一個許可證 semaphore.release(); } }; new Thread(runnable).start(); } } /* * 輸出結(jié)果: * Thread-0執(zhí)行任務(wù)A... */
“執(zhí)行任務(wù)B”永遠(yuǎn)不會打印,因為許可證只有一個,第二次acquire方法的調(diào)用會因為無法獲取到許可證而一直阻塞。
以上就是Java并發(fā)編程之Semaphore的使用簡介的詳細(xì)內(nèi)容,更多關(guān)于Java并發(fā)編程之Semaphore的資料請關(guān)注腳本之家其它相關(guān)文章!
- Java信號量Semaphore原理及代碼實例
- java并發(fā)編程專題(六)----淺析(JUC)Semaphore
- Java 信號量Semaphore的實現(xiàn)
- 通俗易懂學(xué)習(xí)java并發(fā)工具類-Semaphore,Exchanger
- Java并發(fā)系列之Semaphore源碼分析
- Java并發(fā)編程:CountDownLatch與CyclicBarrier和Semaphore的實例詳解
- Java并發(fā)編程之Semaphore(信號量)詳解及實例
- JAVA 多線程之信號量(Semaphore)實例詳解
- java線程并發(fā)semaphore類示例
- Java并發(fā)編程之工具類Semaphore的使用
相關(guān)文章
java利用JEXL實現(xiàn)動態(tài)表達式編譯
這篇文章主要介紹了java利用JEXL實現(xiàn)動態(tài)表達式編譯,系統(tǒng)要獲取多個數(shù)據(jù)源的數(shù)據(jù),并進行處理,最后輸出多個字段。字段的計算規(guī)則一般是簡單的取值最多加一點條件判斷,下面是具體的實現(xiàn)方法2021-04-04Spring結(jié)合WebSocket實現(xiàn)實時通信的教程詳解
WebSocket?是基于TCP/IP協(xié)議,獨立于HTTP協(xié)議的通信協(xié)議,本文將使用Spring結(jié)合WebSocket實現(xiàn)實時通信功能,有需要的小伙伴可以參考一下2024-01-01Java使用阿里云接口進行身份證實名認(rèn)證的示例實現(xiàn)
這篇文章主要介紹了使用阿里云接口進行身份證實名認(rèn)證的示例實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07