Semaphore:

信号量,用来限制同时访问共享资源的线程上限

应用:

使用Semaphore限流,在访问高峰期时,可以让请求线程阻塞,高峰期过去再释放许可,当然只适合限制单机线程数量,并且仅是限制线程数,而不是限制资源数(比如连接数)

用Semaphore实现简单的数据库连接池,对比用wait-notify,性能和可读性更好


原理:

1.加锁解锁流程

Semaphore 有点像一个停车场,permits 就好像停车位数量,当线程获得了 permits 就像是获得了停车位,然后
停车场显示空余车位减一

刚开始,permits(state)为 3,这时 5 个线程来获取资源

1.png

假设其中 Thread-1,Thread-2,Thread-4 cas 竞争成功,而 Thread-0 和 Thread-3 竞争失败,进入 AQS 队列
park 阻塞

2.png

这时 Thread-4 释放了 permits,状态如下

3.png

接下来 Thread-0 竞争成功,permits 再次设置为 0,设置自己为 head 节点,断开原来的 head 节点,unpark 接
下来的 Thread-3 节点,但由于 permits 是 0,因此 Thread-3 在尝试不成功后再次进入 park 状态

4.png