Semaphore

用来限制能同时访问共享资源的线程上限(permits,许可),同一时间只有持有该许可的线程可以访问。

应用

  • 使用 Semaphore 限流,在访问高峰期时,让请求线程阻塞,高峰期过去再释放许可,当然它只适合限制单机线程数量,并且仅是限制线程数,而不是限制资源数
  • 简易的数据库连接池,一个线程对应一个连接。

StampedLock

该类自 JDK 8 加入,是为了进一步优化读性能,它的特点是在使用读锁、写锁时都必须配合“戳”利来使用。但该锁不支持可重入、不支持条件变量

使用

读-读场景

乐观读锁(并没有实际意义上的加锁),StampedLock 拥有 tryOptimisticRead() 方法,读取完毕后需要做一次戳校验 如果校验通过,表示这期间确实没有写操作,数据可以安全使用
如果校验没通过,需要重新获取读锁,保证数据安全。
image.png

读-写场景

读写场景下时锁升级成写锁。


CountDownLatch

用来进行线程同步协作,等待所有线程完成倒计时。
其中构造参数用来初始化等待计数值,await() 用来等待计数归零,countDown() 用来让计数减一

CyclicBarrier