它可以維護目前通路自身的線程個數,并提供了同步機制,使用它可以控制同時通路資源的線程個數,如實作一個檔案允許的并發通路數.
單個信号燈對象可以實作互斥鎖的功能,并且可以是由一個線程獲得了"鎖",再由另一個線程釋放"鎖",可應用于死鎖恢複的場合.
注:還有另一個構造器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);
}
}
}