信号量为多线程协作提供了更为强大的控制方法。从广义来说,信号量时对锁的扩展。无论是内部锁synchronized还是重入锁ReentrantLock,一次只允许一个线程访问一个资源,而信号量却可以允许多个线程,同时访问同一个资源。
信号量的构造函数
public Semaphore(int permits)
public Semaphore(int permits, boolean fair)
permits 准入数
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();
}
}
}
网友评论