Java中的Semaphore信號量簡單使用代碼實例
Semaphore信號量
Semaphore是用來保護(hù)一個或者多個共享資源的訪問,Semaphore內(nèi)部維護(hù)了一個計數(shù)器,其值為可以訪問的共享資源的個數(shù)。
一個線程要訪問共享資源,先獲得信號量,如果信號量的計數(shù)器值大于1,意味著有共享資源可以訪問,則使其計數(shù)器值減去1,再訪問共享資源。
如果計數(shù)器值為0,線程進(jìn)入休眠。當(dāng)某個線程使用完共享資源后,釋放信號量,并將信號量內(nèi)部的計數(shù)器加1,之前進(jìn)入休眠的線程將被喚醒并再次試圖獲得信號量。 例如:停車場的車位 ,有空閑車位才可以停,沒有空閑車位只能等待。 主要使用方法:
acquire() 從信號量獲取一個許可,在提供一個許可之前一直將線程阻塞 否則線程被中斷
release() 釋放一個許可,將其返回給信號量
例子: 停車場有五個停車位 有十輛車要停
public class SemaphoreDemo { public static void main(String[] args) { //參數(shù) 許可數(shù)量 例有五個空停車位 Semaphore semaphore = new Semaphore(5); //模擬10輛汽車 要停車 只能有五輛汽車同時停 其他車只能等待 for (int i = 0; i < 10; i++) { new Thread(() -> { try { //acquire()得到 成功拿到車位停車 semaphore.acquire(); System.out.println(Thread.currentThread().getName() + "搶到車位"); //停兩秒鐘的車 TimeUnit.SECONDS.sleep(2); //離開車位 System.out.println(Thread.currentThread().getName() + "離開車位"); } catch (InterruptedException e) { e.printStackTrace(); } finally { //release()釋放 semaphore.release(); } }).start(); } } }
到此這篇關(guān)于Java中的Semaphore信號量簡單使用代碼實例的文章就介紹到這了,更多相關(guān)Semaphore信號量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解基于java的Socket聊天程序——客戶端(附demo)
這篇文章主要介紹了詳解基于java的Socket聊天程序——客戶端(附demo),客戶端設(shè)計主要分成兩個部分,分別是socket通訊模塊設(shè)計和UI相關(guān)設(shè)計。有興趣的可以了解一下。2016-12-12Java單例模式利用HashMap實現(xiàn)緩存數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Java單例模式利用HashMap實現(xiàn)緩存數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04Spring Boot Admin實現(xiàn)服務(wù)健康預(yù)警功能
這篇文章主要介紹了Spring Boot Admin實現(xiàn)服務(wù)健康預(yù)警功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05Netty分布式Future與Promise執(zhí)行回調(diào)相關(guān)邏輯剖析
這篇文章主要為大家介紹了Netty分布式Future與Promise執(zhí)行回調(diào)相關(guān)邏輯剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03Java Stream的基本概念以及創(chuàng)建方法
這篇文章主要介紹了Java Stream的基本概念以及創(chuàng)建方法,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下2020-08-08springboot vue完成編輯頁面發(fā)送接口請求功能
這篇文章主要為大家介紹了springboot+vue完成編輯頁發(fā)送接口請求功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05