1. 程式人生 > >JAVA同步工具類——Semaphore訊號量

JAVA同步工具類——Semaphore訊號量

訊號量

計數訊號量(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();
}
}