微信公众号:[Amos博客]
作者菜鸟一枚,所发内容为自己学习道路上的一些积累。如有错误非常欢迎您的指正。
[如果你觉得文章对您有帮助,欢迎关注]
内容目录
Semaphore简介Semaphore类结构初始化信号量获取许可非公平锁,支持中断获取许可公平锁,不支持中断获取许可释放信号量总结获取更多文章
Semaphore简介
1:Semaphore(信号量)是用来控制同时访问特定资源的线程数量,可以用于做流量控制。它通过协调各个线程,以保证合理的使用公共资源。其内部通过一个permit来控制并发的线程量。信号量有两种形式,一种是通过nonfair和fair。nonfair是通过抢占式获取许可。fair遵循FIFO获取许可。
2:for example : 现在有一个需求是读取100万条数据的excel并且存入数据库。但是数据库的链接只有10个。那么怎么实现这个需求呢?首先读取excel肯定启用线程池读取,如果启用的线程池数量大于10。那么在插入的时候就存在问题。这时候使用信号量就完美解决了这个问题。伪代码如下
Semaphore类结构
1:Semaphore类里面有三个内部类,Sync继承AQS类,NonfairSync,FairSync。
初始化信号量
获取许可
非公平锁,支持中断获取许可
1:不支持中断获取许可的区别在于,如果支持中断并且调用Thread.interruot(),会在park完成以后抛出throw new InterruptedException();不支持就会recheck。
公平锁,不支持中断获取许可
释放信号量
总结
1:通过解读源码我们可以发现Semaphore是基于AQS共享锁实现的。
2:默认尝试在非公平模式下获取一个许可,或者叫做锁。如果获取到则立即返回并将许可计数器减一,如果没有获取到,则入到AQS队列自旋等待,当此节点的前驱是头结点后,又开始尝试获取锁。直至成功获取或中断。
获取更多文章
领取专属 10元无门槛券
私享最新 技术干货