JAVA同步工具類——Semaphore訊號量
阿新 • • 發佈:2019-02-14
訊號量
計數訊號量(Counting Semaphore)用來控制同時訪問某個特定資源的運算元量,或者同時執行某個指定操作的數量;
Semaphore管理著一組虛擬許可(permit),許可的初始數量可通過建構函式來指定;在執行操作時先獲取許可(只要還有剩餘的許可),使用完成後釋放許可;如果沒有許可那麼acquire將阻塞直到有許可(或者被中斷或操作超時);release方法將返回一個許可給訊號量;
初始值為1的Semaphore稱為二值訊號量;二值訊號量可以用作互斥體(mutex),並具備不可重入的加鎖語義;誰擁有這個唯一的許可誰就擁有了互斥鎖;
使用場景:
Semaphore是一件可以容納N人的房間,如果人不滿就可以進去,如果人滿了,就要等待有人出來
/** * 假設公司體檢,房間裡一共有3位體檢醫師,所以一次可以進入3個人,有人出來就有人可以進去 */ public class Appliction { public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException { Semaphore semaphore = new Semaphore(3); for (int i = 0; i < 100; i++) { new Thread(new PhysicalExaminationTask(semaphore)).start(); } } } class PhysicalExaminationTask implements Runnable{ private Semaphore semaphore; public PhysicalExaminationTask(Semaphore semaphore){ this.semaphore = semaphore; } @Override public void run() { try { semaphore.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } int time = new Random().nextInt(5); if (time > 0) { try { TimeUnit.SECONDS.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } } System.err.println(Thread.currentThread().getName() + " finished"); semaphore.release(); } }