Semaphore-一个计数信号量

本文深入探讨了信号量在程序中的应用,特别是在限流场景下如何通过信号量来控制并发线程的数量。通过示例代码展示了信号量的工作原理:线程在执行任务前必须获取许可证,完成任务后归还许可证,从而实现对并发访问的有效控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在概念上,信号量维持一组许可证。 如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它。 每个release()添加许可证,潜在地释放阻塞获取方。 但是,没有使用实际的许可证对象; Semaphore只保留可用数量的计数,并相应地执行。
2.信号量通常用于限制线程数,而不是访问某些(物理或逻辑)资源。

 //Semaphore主要用于限流
        // 在获得项目之前,每个线程必须从信号量获取许可证,以确保某个项目可用。 当线程完成该项目后,它将返回到池中,
        // 并将许可证返回到信号量,允许另一个线程获取该项目。 请注意,当调用acquire
         final int MAX_AVAILABLE = 4;
         Semaphore available = new Semaphore(MAX_AVAILABLE, true);
         for(int i =0;i<10;i++){
             new Thread(()->{
                 try {
                     available.acquire();  //加锁
                     System.out.println(Thread.currentThread().getName()+"****加锁");
                     TimeUnit.SECONDS.sleep(1);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }finally {
                     System.out.println(Thread.currentThread().getName()+"****减锁");
                     available.release();   //释放
                 }
             }).start();
         }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值