前言
在熟悉了AQS以及读写锁之后,Semaphore更简单了
Semaphore
还是和前几篇总结一样,不直接看源码,而是先思考怎么通过AQS的结构完成Semaphore的目的
- Semaphore的作用是什么
- 限制同时能有多少个线程获取锁
- 线程占锁达到限制后,进入队列等待
- 可以用于数据库连接池的实现
- 同时多个线程获取锁怎么实现?
- 其实就是读写锁的读读并发实现嘛
- 很快就能想到,走的是AQS的共享入口acquireShared
- 复习一下该入口AQS会做什么
- 获取锁后会唤醒其后线程
- 并且不需要考虑ownerThread
- 怎么判断占锁线程数是否达到限制?
- 将state初始值设为上限n
- 每成功占锁一个线程,就让n-1
- 当n==0时,进来的线程判断n为0则阻塞
上述就是Semaphore的原理了,其余的都与读锁相同