前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Semaphore信号量

Semaphore信号量

作者头像
暴躁的程序猿
发布2022-03-23 20:02:59
2560
发布2022-03-23 20:02:59
举报
文章被收录于专栏:阿飞的学习记录

Semaphore信号量

Semaphore是用来保护一个或者多个共享资源的访问,Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。一个线程要访问共享资源,先获得信号量,如果信号量的计数器值大于1,意味着有共享资源可以访问,则使其计数器值减去1,再访问共享资源。

如果计数器值为0,线程进入休眠。当某个线程使用完共享资源后,释放信号量,并将信号量内部的计数器加1,之前进入休眠的线程将被唤醒并再次试图获得信号量。 例如:停车场的车位 ,有空闲车位才可以停,没有空闲车位只能等待。 主要使用方法:

acquire() 从信号量获取一个许可,在提供一个许可之前一直将线程阻塞 否则线程被中断

release() 释放一个许可,将其返回给信号量

例子: 停车场有五个停车位 有十辆车要停

代码语言:javascript
复制
public class SemaphoreDemo {
    public static void main(String[] args) {
        //参数 许可数量  例有五个空停车位
        Semaphore semaphore = new Semaphore(5);
        //模拟10辆汽车  要停车  只能有五辆汽车同时停  其他车只能等待
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                try {
                    //acquire()得到  成功拿到车位停车
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "抢到车位");
                    //停两秒钟的车
                    TimeUnit.SECONDS.sleep(2);
                    //离开车位
                    System.out.println(Thread.currentThread().getName() + "离开车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    //release()释放
                    semaphore.release();
                }
            }).start();
        }
    }
}
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/07/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Semaphore信号量
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档