Java高并发--信号量(Semaphore)

108 阅读1分钟

信号量Semaphore

信号量为多线程协作提供了更为强大的控制方法。从广义上说,信号量是对锁的扩展。无论是内部锁synchronized还是重入锁ReentrantLock,一次都只允许一个线程访问一个资源,而信号量却可以指定多个线程,同时访问某一个资源。 主要的方法有

  • public void acquire():获得一个准入的许可,若无法获得会等待,知道有线程释放一个许可或者当前线程被中断
  • public void anquireUniterruptibly():与acquire方法相似,但是不响应中断
  • public boolean tryAcquire():尝试获得一个许可,如果成功返回true,否则为false,不会进行等待,会立刻返回
  • public boolean tryAcquire(long timeout,TimeUnit unit):可以添加参数,表示指定时间内
  • public void release():在线程访问结束后释放一个许可,使得其他等待许可的线程可以进行资源访问

代码案例如下:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SemaphoreTest implements Runnable{
    //包含5个许可的信号量
    final Semaphore semp=new Semaphore(5);
    @Override
    public void run() {
        try {
            semp.acquire();
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getId()+"运行");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            semp.release();
        }
    }

    public static void main(String[] args) {
        ExecutorService exec= Executors.newFixedThreadPool(20);
        final SemaphoreTest demo=new SemaphoreTest();
        for (int i=0;i<20;i++){
            exec.submit(demo);
        }
    }
}

运行结果一部分截屏:

image.png