天天看點

juc--Semaphore(信号量)的使用

juc包裡的Semaphore信号量主要應用在多線程争搶多資源的情況下

在信号量上我們定義兩種操作

  1. acquire(擷取):當一個線程調用acquire操作時,他要麼通過成功擷取信号量(信号量減一),要麼一直等下去,直到有線程釋放信号量,或逾時
  2. release(釋放):實際上會将信号量的值加一,然後喚醒等待的線程

信号量主要用于兩個目的

  1. 控制多個共享資源的互斥使用
  2. 控制并發線程數

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一樣