天天看點

Java并發程式設計之Semaphore信号量控制

Semaphone介紹

通過 Semaphore,可以很容易控制某一個資源可被同時通路的個數。

它維護了目前通路的個數,提供同步機制來控制同時通路個數

Semaphore 對象被執行個體化時,需要告訴它許可的個數,線程隻有擷取許可,才能對資源進行通路。

Semaphore 提供了兩個方法對資源的通路進行控制

  • acquire():擷取一個許可,如果沒有,就等待
  • release():操作完成後,釋放一個許可

Semaphore執行個體

public class Test {
	public static void main(String[] args) {
		ExecutorService pool = Executors.newCachedThreadPool();
		final Semaphore semaphore=new Semaphore(2);
		for(int i=0;i<20;i++){
			pool.execute(new Runnable() {
				@Override
				public void run() {
					try {
						semaphore.acquire();//擷取一個許可
						test();
						semaphore.release();//釋放一個許可
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			});
		}
	}
	public static void test(){
		System.out.println(Thread.currentThread().getName());
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
           

上面的例子中,可以看到,輸出是每兩個一塊進行輸出的。

也就是說,對于test()這個方法的通路,一次性隻能有兩個進入。

一次性擷取多個許可

Semaphore允許一次性擷取和釋放多個許可。

semaphore.acquire(3);//擷取三個許可
test();
semaphore.release(3);//釋放三個許可
           

tryAcquire()

嘗試擷取一個許可,如果不能擷取,就直接忽略

if(semaphore.tryAcquire()){
	dosomething......
	semaphone.release();
}
           

Semaphore的使用場景

資料庫的連接配接數是有限的,是以當多個線程對資料庫發起通路請求時,可以使用Semaphore進行通路控制。