Semaphore
用来限制能同时访问共享资源的线程上限(permits,许可),同一时间只有持有该许可的线程可以访问。
应用
- 使用 Semaphore 限流,在访问高峰期时,让请求线程阻塞,高峰期过去再释放许可,当然它只适合限制单机线程数量,并且仅是限制线程数,而不是限制资源数
- 简易的数据库连接池,一个线程对应一个连接。
StampedLock
该类自 JDK 8 加入,是为了进一步优化读性能,它的特点是在使用读锁、写锁时都必须配合“戳”利来使用。但该锁不支持可重入、不支持条件变量
使用
读-读场景
乐观读锁(并没有实际意义上的加锁),StampedLock 拥有 tryOptimisticRead() 方法,读取完毕后需要做一次戳校验 如果校验通过,表示这期间确实没有写操作,数据可以安全使用
如果校验没通过,需要重新获取读锁,保证数据安全。
读-写场景
读写场景下时锁升级成写锁。
CountDownLatch
用来进行线程同步协作,等待所有线程完成倒计时。
其中构造参数用来初始化等待计数值,await() 用来等待计数归零,countDown() 用来让计数减一