信号量 Semaphore 控制方法同时进入线程数量

251 阅读1分钟

Semaphore(信号量),用于控制同时进入一个方法的线程数量,多个信号量配合,可以实现线程同步。

Semaphore对象在创建时,会指定线程数量。

private final Semaphore semaphore = new Semaphore(5);

常用的方法有两个:

  • acquire():线程尝试获取信号量,获取成功时信号量内部的允许进入的线程数量会减1,当数量为0时,新进入的线程会在这里阻塞。
  • release():线程释放信号量,信号量内部的允许进入的线程数量加1。

通常使用步骤是:
在需要同步控制的方法进入的地方调用 acquire() 获取信号量,在退出方法的时候调用 release() 释放信号量。

以下代码控制同时只有5个线程可以进入方法

public class SemaphoreTest {
    private final Semaphore semaphore = new Semaphore(5);

    public static void main(String[] args) {
        new SemaphoreTest().test();
    }

    private void test() {
        for (int i = 0; i < 50; i++) {
            new Thread(this::method, "thread " + i).start();
        }
    }

    private void method() {
        try {
            semaphore.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " enter");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " exit");
        semaphore.release();
    }

}