Semaphore:
信号量,用来限制同时访问共享资源的线程上限
应用:
使用Semaphore限流,在访问高峰期时,可以让请求线程阻塞,高峰期过去再释放许可,当然只适合限制单机线程数量,并且仅是限制线程数,而不是限制资源数(比如连接数)
用Semaphore实现简单的数据库连接池,对比用wait-notify,性能和可读性更好
原理:
1.加锁解锁流程
Semaphore 有点像一个停车场,permits 就好像停车位数量,当线程获得了 permits 就像是获得了停车位,然后
停车场显示空余车位减一
刚开始,permits(state)为 3,这时 5 个线程来获取资源
假设其中 Thread-1,Thread-2,Thread-4 cas 竞争成功,而 Thread-0 和 Thread-3 竞争失败,进入 AQS 队列
park 阻塞
这时 Thread-4 释放了 permits,状态如下
接下来 Thread-0 竞争成功,permits 再次设置为 0,设置自己为 head 节点,断开原来的 head 节点,unpark 接
下来的 Thread-3 节点,但由于 permits 是 0,因此 Thread-3 在尝试不成功后再次进入 park 状态