java 三剑客,Java并发工具三剑客之Semaphore源码解析

475475b7ee265a6560a1586ad4b12097.png

上一期介绍了CyclicBarrier的源码解析,今天来聊一聊最后一个工具:信号量 Semaphore。Semaphore用来控制同时操作某个资源的操作数量。Semaphore管理着permits,每当一个线程来获取许可时,permits数减1,当permits数小于0时,再来获取许可的资源就需要阻塞。下面来详细看看Semaphore的实现原理。

内部类

Semaphore支持公平和非公平两种实现。

89da13e4eed85d33133e41b8fb7f948f.png

55267df72b8af23fdee00390f06ee9a2.png

构造方法

permits表示许可的数量,需要在创建Semaphore的时候赋值,Semaphore默认为非公平的。

如果要使用公平的,则需要指定fair参数为true。

7d9811da2238ee5a00c2a29b8db32dc1.png

方法

acquire

acquire方法调用了Sync的acquireSharedInterruptibly方法

3d80bbe8b878f9ea075dc4aaab37585d.png

tryAcquireShared方法在Semaphore中分为公平和非公平的两种方式,公平的方式会先去判断前面有没有排队获取许可的线程,如果有说明许可是小于0的,所以直接返回-1。之后公平和非公平的操作是相同的,都是获取state值,减1,通过cas的方式更新state值,返回更新后的值。

tryAcquireShared返回的值如果小于0,说明许可值不够了,需要去排队等待。

3a4453ddf15a403bb7a7606e388cba99.png

release

release方法释放一个许可,把它归还给Semaphore,然后把可用的许可(permits)数目加1。

release额方法调用了AQS的releaseShared方法

dcfce55abf5e3e5be0d4a09776d247d7.png

tryReleaseShared方法通过cas的方式把当前的state值更新为state+arg。

d38cba071c232a2ec03dd78a0784dde2.png

doReleaseShared的操作在CountDownLatch的countDown方法中也有用到,大家可以去参照countDown方法Java并发工具三剑客之CountDownLatch源码解析

示例

Semaphore的源码中给出了使用的实例,大家可以参考,毕竟官方的肯定是很有指导意义的。

40008f213af7f4ae55df988881568b0c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值