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進行通路控制。