信号量 Semaphore

举报
西魏陶渊明 发表于 2022/09/25 05:31:59 2022/09/25
【摘要】 作者: 西魏陶渊明 博客: https://blog.springlearn.cn/ (opens new window) 西魏陶渊明 莫笑少年江湖梦,谁不少年梦江湖 # 🚀 知识快读 Semaphore 翻译过来就是信号量, 其根本原理就是基于 CA...

作者: 西魏陶渊明 博客: https://blog.springlearn.cn/ (opens new window)

西魏陶渊明

莫笑少年江湖梦,谁不少年梦江湖

# 🚀 知识快读

Semaphore 翻译过来就是信号量, 其根本原理就是基于 CAS 共享锁的一种实现。举一个例子。 假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。

那么上面的这个例子可以这样理解,资源一共有3个, 即三个车位。如何来控制这5辆汽车,来合理的使用这3个资源呢? Semaphore 可以这样来定义。


    
  1. // 1. 定一个信号量,声明有3个资源。使用公平模式线程将会按到达的顺序(FIFO)执行(也就是等待时间最长的先执行),如果是非公平,则可以后请求的有可能排在队列的头部。
  2. Semaphore semp = new Semaphore(3);
  3. // 2. 获取1个许可 - 最大允许3个进入,一但超过就让其等待,除非已经释放
  4. semp.acquire();
  5. // 3. 释放1个许可
  6. semp.release();
  7. // 4. 获取1许可,失败就返回,不等待
  8. semp.tryAcquire();
  9. // 5. 获取2许可,失败就返回,不等待
  10. semp.tryAcquire(2);
  11. // 6. 不允许被中断
  12. semp.acquireUninterruptibly();
1 2 3 4 5 6 7 8 9 10 11 12

# 知识点1: Fair & NoFair

Semaphore 的模式配置,只是构造来定义。

  • 默认构造不公平模式, 谁来申请资源,就先尝试获取资源。排队的要等到没有资源进来申请才能继续申请

    
  1. public Semaphore(int permits) {
  2. sync = new NonfairSync(permits);
  3. }
  4. public Semaphore(int permits, boolean fair) {
  5. sync = fair ? new FairSync(permits) : new NonfairSync(permits);
  6. }
1 2 3 4 5 6 7

# 知识点2: 申请资源

  • acquire() 获取1个资源,获取不到就等待,如果线程中断,会直接中断。
  • acquire(2) 获取2个资源,获取不到就等待,如果线程中断,会直接中断。
  • tryAcquire() 获取1个资源,获取不到就返回 false,如果线程中断,会直接中断。
  • acquireUninterruptibly() 获取1个资源,获取不到就等待,不会关心线程中断。

# 知识点3: 释放资源

  • release() 释放一个资源
  • release(2) 释放两个资源

# 知识点4: 其他API

  • availablePermits() 当前资源数量
  • drainPermits() 获取当前资源数量,并将剩余资源清零,直接赋值0
  • reducePermits(2) 将资源数量,扣减2个
  • isFair() 是否公平
  • hasQueuedThreads() 是否还有线程等待
  • getQueueLength() 还有多少线程等待
  • getQueuedThreads() 获取所有的线程集合

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/125858008

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。