java Semaphore‌

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. 结果符合预期。

相关推荐
咖啡八杯5 分钟前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育17 分钟前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
腻害兔2 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
SeaTunnel2 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影2 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Marst Code3 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
Miao121313 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔3 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城4 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience6 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu