信號(hào)量,是一種共享鎖,多個(gè)線程同時(shí)訪問(wèn)一個(gè)資源時(shí),通過(guò)它實(shí)現(xiàn)同一時(shí)刻的訪問(wèn)線程數(shù)量。最常見(jiàn)的使用場(chǎng)景就是高并發(fā)下的限流。
Semaphore常用方法說(shuō)明
acquire()
獲取一個(gè)令牌,在獲取到令牌、或者被其他線程調(diào)用中斷之前線程一直處于阻塞狀態(tài)。
tryAcquire()
嘗試獲得令牌,返回獲取令牌成功或失敗,不阻塞線程。
availablePermits()
返回可用的令牌數(shù)量。
release()
釋放一個(gè)令牌,喚醒一個(gè)獲取令牌不成功的阻塞線程。
示例:
每個(gè)停車場(chǎng)入口都有一個(gè)提示牌,上面顯示著停車場(chǎng)的剩余車位還有多少,當(dāng)剩余車位為0時(shí),不允許車輛進(jìn)入停車場(chǎng),直到停車場(chǎng)里面有車離開(kāi)停車場(chǎng),這時(shí)提示牌上會(huì)顯示新的剩余車位數(shù)。
1、停車場(chǎng)容納總停車量10。
2、當(dāng)一輛車進(jìn)入停車場(chǎng)后,顯示牌的剩余車位數(shù)響應(yīng)的減1.
3、每有一輛車駛出停車場(chǎng)后,顯示牌的剩余車位數(shù)響應(yīng)的加1。
4、停車場(chǎng)剩余車位不足時(shí),車輛只能在外面等待。
代碼:
public class SemaphoreUtil {
private static Semaphore semaphore = new Semaphore(10);
public static void main(String[] args) {
for (int i=0;i<50;i++) {
Thread thread = new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + "到停車場(chǎng)門口");
if (semaphore.availablePermits() == 0) {
System.out.println("車位已滿");
}
//車位未滿,可以獲取進(jìn)入權(quán)限
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "進(jìn)入了停車場(chǎng)");
Thread.sleep(new Random().nextInt(10000));//模擬車輛在停車場(chǎng)停留的時(shí)間
System.out.println(Thread.currentThread().getName()+"駛出停車場(chǎng)");
semaphore.release(); //釋放令牌,更新空車位
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.start();
}
}
}