学习
实践
活动
工具
TVP
写文章

Semaphore源码解析

微信公众号:[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队列自旋等待,当此节点的前驱是头结点后,又开始尝试获取锁。直至成功获取或中断。

获取更多文章

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180812G1FYOF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券