Java中的Semaphore信號(hào)量簡(jiǎn)單使用代碼實(shí)例
Semaphore信號(hào)量
Semaphore是用來(lái)保護(hù)一個(gè)或者多個(gè)共享資源的訪問(wèn),Semaphore內(nèi)部維護(hù)了一個(gè)計(jì)數(shù)器,其值為可以訪問(wèn)的共享資源的個(gè)數(shù)。
一個(gè)線程要訪問(wèn)共享資源,先獲得信號(hào)量,如果信號(hào)量的計(jì)數(shù)器值大于1,意味著有共享資源可以訪問(wèn),則使其計(jì)數(shù)器值減去1,再訪問(wèn)共享資源。
如果計(jì)數(shù)器值為0,線程進(jìn)入休眠。當(dāng)某個(gè)線程使用完共享資源后,釋放信號(hào)量,并將信號(hào)量?jī)?nèi)部的計(jì)數(shù)器加1,之前進(jìn)入休眠的線程將被喚醒并再次試圖獲得信號(hào)量。 例如:停車(chē)場(chǎng)的車(chē)位 ,有空閑車(chē)位才可以停,沒(méi)有空閑車(chē)位只能等待。 主要使用方法:
acquire() 從信號(hào)量獲取一個(gè)許可,在提供一個(gè)許可之前一直將線程阻塞 否則線程被中斷
release() 釋放一個(gè)許可,將其返回給信號(hào)量
例子: 停車(chē)場(chǎng)有五個(gè)停車(chē)位 有十輛車(chē)要停
public class SemaphoreDemo {
public static void main(String[] args) {
//參數(shù) 許可數(shù)量 例有五個(gè)空停車(chē)位
Semaphore semaphore = new Semaphore(5);
//模擬10輛汽車(chē) 要停車(chē) 只能有五輛汽車(chē)同時(shí)停 其他車(chē)只能等待
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
//acquire()得到 成功拿到車(chē)位停車(chē)
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "搶到車(chē)位");
//停兩秒鐘的車(chē)
TimeUnit.SECONDS.sleep(2);
//離開(kāi)車(chē)位
System.out.println(Thread.currentThread().getName() + "離開(kāi)車(chē)位");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//release()釋放
semaphore.release();
}
}).start();
}
}
}
到此這篇關(guān)于Java中的Semaphore信號(hào)量簡(jiǎn)單使用代碼實(shí)例的文章就介紹到這了,更多相關(guān)Semaphore信號(hào)量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于SpringBoot開(kāi)機(jī)啟動(dòng)與@Order注解
這篇文章主要介紹了SpringBoot開(kāi)機(jī)啟動(dòng)與@Order注解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
springboot自帶的緩存@EnableCaching用法
這篇文章主要介紹了springboot自帶的緩存@EnableCaching用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
用java實(shí)現(xiàn)跳動(dòng)的小球示例代碼
這篇文章主要介紹了用java實(shí)現(xiàn)跳動(dòng)的小球,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
Spring Boot應(yīng)用關(guān)閉分析詳解
本文挖掘了Spring Boot的關(guān)閉方式,并列舉了關(guān)閉方式,從原理、源碼的角度闡述了Spring Boot的關(guān)閉代碼及擴(kuò)展點(diǎn),感興趣的朋友一起看看吧2024-12-12
SpringBoot2 整合FreeMarker實(shí)現(xiàn)頁(yè)面靜態(tài)化示例詳解
這篇文章主要介紹了SpringBoot2 整合FreeMarker實(shí)現(xiàn)頁(yè)面靜態(tài)化示例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Java多線程實(shí)現(xiàn)異步調(diào)用的方法
本文給大家分享java多線程實(shí)現(xiàn)異步調(diào)用的方法,感興趣的朋友跟著腳本之家小編一起學(xué)習(xí)吧2015-09-09
SpringBoot整合Redis實(shí)現(xiàn)登錄失敗鎖定功能(實(shí)例詳解)
本文我們已經(jīng)探討如何利用Redis來(lái)實(shí)現(xiàn)鎖定賬戶的安全措施,以及通過(guò)SpringBoot整合Redis實(shí)現(xiàn)了這一功能,感興趣的朋友跟隨小編一起學(xué)習(xí)下吧2024-02-02
WIN10環(huán)境 Maven的安裝與配置詳細(xì)教程
這篇文章主要介紹了WIN10環(huán)境 Maven的安裝與配置詳細(xì)教程,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09

