juc包裡的Semaphore信号量主要應用在多線程争搶多資源的情況下
在信号量上我們定義兩種操作
- acquire(擷取):當一個線程調用acquire操作時,他要麼通過成功擷取信号量(信号量減一),要麼一直等下去,直到有線程釋放信号量,或逾時
- release(釋放):實際上會将信号量的值加一,然後喚醒等待的線程
信号量主要用于兩個目的
- 控制多個共享資源的互斥使用
- 控制并發線程數
Semaphore信号量的應用小demo
場景:現在有三個停車位,有六輛車想要争搶停車位
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
//六輛車争搶車位
for (int i = 0; i < 6; i++) {
new Thread(()->{
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "搶到了車位");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
}, "車" + (i + 1)).start();
}
}
執行結果:
車2搶到了車位
車3搶到了車位
車1搶到了車位
車5搶到了車位
車4搶到了車位
車6搶到了車位
若Semaphore的構造方法傳入的參數值為1,即此時隻有一個資源,那麼其效果和synchronized一樣