Java Semaphore 用于控制同时访问特定资源的线程数量,通过管理一组"许可"(permits)实现并发限制。
模拟6人上厕所,但只有两个坑位,测试代码:
java
import java.util.concurrent.Semaphore;
// 假设厕所只有俩个坑位,模拟6人上厕所
private static void testSemaphore() {
int count = 2; // 坑位数量
// 创建Semaphore(2个许可证, 同一时刻最多2个线程能获取到许可),
// 许可证就相当于需要竞争的资源(这里是厕所坑位资源)
Semaphore semaphore = new Semaphore(count);
// 6人竞争资源, 假设每个线程为一个等待上厕所的人。
String[] people = {"田伯光", "灭绝师太", "陆小凤", "周伯通", "赵钱孙", "黄老邪"}; // 等待上厕所的人
for (int i = 0; i < people.length; i++) {
int finalI = i;
new Thread(() -> {
try {
System.out.println(people[finalI] + " 等待上厕所 " + getNowTimeStr());
semaphore.acquire(); // 获取1个许可 ,也可以这样调用:semaphore.acquire(1)
System.out.println(people[finalI] + " 占用厕所1个坑位 " + getNowTimeStr());
Thread.sleep(1000); // 模拟资源使用(即蹲坑的过程)
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println(people[finalI] + " 爽完了,释放厕所1个坑位 " + getNowTimeStr());
semaphore.release(); // 释放许可
}
}).start();
}
}
private static String getNowTimeStr() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(new Date());
}
打印:

ok. 结果符合预期。