美文网首页
Semaphore信号量

Semaphore信号量

作者: 12点前睡觉hhh | 来源:发表于2019-05-31 10:02 被阅读0次

信号量为多线程协作提供了更为强大的控制方法。从广义来说,信号量时对锁的扩展。无论是内部锁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();
        }
    }
}

相关文章

网友评论

      本文标题:Semaphore信号量

      本文链接:https://www.haomeiwen.com/subject/cftvtctx.html