天天看點

同步器--Semaphore

它可以維護目前通路自身的線程個數,并提供了同步機制,使用它可以控制同時通路資源的線程個數,如實作一個檔案允許的并發通路數.

單個信号燈對象可以實作互斥鎖的功能,并且可以是由一個線程獲得了"鎖",再由另一個線程釋放"鎖",可應用于死鎖恢複的場合.

注:還有另一個構造器Semaphore(int permits, boolean fair),其中fair為true表示先進來的先拿到燈,即公平,預設為false.

public class SemaphoreTest {
	
	public static void main(String[] args) {
		ExecutorService service = Executors.newCachedThreadPool();
		final Semaphore sp = new Semaphore(3);
		
		for (int i = 0; i < 10; i++) {
			Runnable runnable = new Runnable() {
				public void run() {
					try {
						sp.acquire();
					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}
					System.out.println("線程" + Thread.currentThread().getName()
							+ "進入,目前已有" + (3 - sp.availablePermits()) + "個并發");
					try {
						Thread.sleep((long) (Math.random() * 10000));
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("線程" + Thread.currentThread().getName()
							+ "即将離開");
					sp.release();
					// 下面代碼有時候執行不準确,因為其沒有和上面的代碼合成原子單元
					System.out.println("線程" + Thread.currentThread().getName()
							+ "已離開,目前已有" + (3 - sp.availablePermits()) + "個并發");
				}
			};
			service.execute(runnable);
		}
	}
}