Semaphore 是 Java.util.concurrent 包中提供的一个线程同步工具类,它可以用来控制同时访问某个资源的线程数量。


Semaphore 代码示例 1 :

import java.util.concurrent.Semaphore;

public class SemaphoreExample { public static void main(String\[\] args) {

    Semaphore semaphore \\\\= new Semaphore(3);

    for (int i \\\\= 1; i <= 5; i++) {
        new Thread(() -> {
            try {

                semaphore.acquire();
                System.out.println(Thread.currentThread().getName() + " 获取到许可");

                Thread.sleep(2000);
                System.out.println(Thread.currentThread().getName() + " 执行完毕");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {

                semaphore.release();
                System.out.println(Thread.currentThread().getName() + " 释放许可");
            }
        }).start();
    }
}

}

代码解析:

  1. 创建一个 Semaphore 对象 semaphore,初始值为 3,表示最多允许 3 个线程同时访问资源。
  2. 创建 5 个线程,每个线程执行的任务是:
  3. 启动线程,让它们开始执行任务。

可能的输出结果:

Thread\-1 获取到许可 Thread\-2 获取到许可 Thread\-3 获取到许可 Thread\-1 执行完毕 Thread\-1 释放许可 Thread\-2 执行完毕 Thread\-2 释放许可 Thread\-3 执行完毕 Thread\-3 释放许可 Thread\-4 获取到许可 Thread\-4 执行完毕 Thread\-4 释放许可 Thread\-5 获取到许可 Thread\-5 执行完毕 Thread\-5 释放许可

在这个示例中,最多允许 3 个线程同时获取许可,其他线程需要等待有许可可用时才能获取。每个线程获取到许可后,执行一段时间后释放许可。请注意,输出的顺序可能会有所不同,因为线程的执行顺序是不确定的。



Semaphore 代码示例 2 :

下面是一个使用 Semaphore 模拟抢占停车位的代码示例: