信號量為多線程協(xié)作提供了更為強大的控制方法拂苹。從廣義來說艇肴,信號量時對鎖的擴展估灿。無論是內部鎖synchronized還是重入鎖ReentrantLock扫沼,一次只允許一個線程訪問一個資源出爹,而信號量卻可以允許多個線程,同時訪問同一個資源缎除。
信號量的構造函數(shù)
public Semaphore(int permits)
public Semaphore(int permits, boolean fair)
permits 準入數(shù)
fair 是否公平
信號量的主要邏輯方法:
public void acquire()
public void acquireUninterruptibly()
public boolean tryAcquire()
public boolean tryAcquire(long timeout, TimeUnit unit)
public void release()
acquire方法嘗試獲得一個準入的許可严就。如果無法獲得,則線程會等待器罐,直到有線程釋放一個許可或者當前線程被中斷梢为。
acquireUninterruptibly與acquire方法類似,但是不響應中斷。
tryAcquire嘗試獲得一個許可铸董,不等待祟印,成功返回true,失敗返回false粟害。
tryAcquire(long timeout, TimeUnit unit)設置一個等待時常蕴忆,在等待時常內成功獲得則返回true,超過時長還沒有獲得則返回false悲幅。
release線程訪問資源結束后釋放一個許可套鹅。
使用實例如下:
class SemaDemo implements Runnable{
final Semaphore semaphore=new Semaphore(5);
@Override
public void run() {
try {
semaphore.acquire();
Thread.sleep(5000);
System.out.println(Thread.currentThread().getId()+"DONE");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semaphore.release();
}
}
public static void main(String[] args) {
SemaDemo semaDemo=new SemaDemo();
for (int i=0;i<20;i++){
Thread thread=new Thread(semaDemo);
thread.start();
}
}
}