Semaphore信号量源码解析

一、用法

信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

 

二、源码:

 

构造方法,设置可以同时运行的线程数量。这里可以设置是公平的,还是非公平的。这里先说非公平的。

 

acqurie()

本质是AQS的方法,

这个方法的本质就是看业务线的try的方法是否返回值小于0,如果是,就挂起这个线程。

 

而这个try方法是看上述这个方法返回值是否大于等于0。

这个方法就是每次调用acquire的时候就把并发数见一,当减到负数的时候,就会去执行挂起线程的方法了。这也就满足了之前使用规则,只有满足要求规定的并发数的线程能运行,其他线程等待。

这里的公平只有一个区别

在获取state锁的时候,看等待队列是不是为空或者自己是等待队列的头结点如果是,就可以获得state锁,如果不是,,就老老实实入队吧。所以这个是公平的。具体可以参考(ReetrantLock看AQS那篇文章)

 

 

是否许可的本质就是调用tryReleaseShared方法

 

这个方法就是根据想要释放的许可数量,把state的值加上几。之后会有doReleaeShared方法唤醒head下第一个需要被唤醒的节点。

 

这里很多东西都没有细述了,因为关于AQS部分在前面文章都说了,理解了前面的,这个就很简单。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值