Semaphore是基于AQS共享锁来实现,默认采用非公平锁。Semaphore 类似于操作系统中的信号量,可以控制对互斥资源的访问线程数。
Semaphore用于限制可以访问某些资源(物理或逻辑的)的线程数目,其维护了一个许可证集合,有多少资源限制就维护多少许可证集合,假如这里有N个资源,那就对应于N个许可证,同一时刻也只能有N个线程访问。一个线程获取许可证就调用acquire方法,用完了释放资源就调用release方法。
可以在构造方法中指定是公平锁还是非公平锁
Semaphore是基于AQS共享锁来实现,默认采用非公平锁。Semaphore 类似于操作系统中的信号量,可以控制对互斥资源的访问线程数。
Semaphore用于限制可以访问某些资源(物理或逻辑的)的线程数目,其维护了一个许可证集合,有多少资源限制就维护多少许可证集合,假如这里有N个资源,那就对应于N个许可证,同一时刻也只能有N个线程访问。一个线程获取许可证就调用acquire方法,用完了释放资源就调用release方法。
可以在构造方法中指定是公平锁还是非公平锁
CyclicBarrier基于AQS的Condition来实现。
相比CountDownLatch,CyclicBarrier 可以有不止一个栅栏,因为它的栅栏(Barrier)可以重复使用(Cyclic)。
CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。
CountDownLatch基于AQS的共享模式,用来控制一个或者多个线程等待多个线程。
CountDownLatch使用一个计数器进行实现。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。
所谓AQS
,指的是AbstractQueuedSynchronizer
,它提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架,ReentrantLock
、Semaphore
、CountDownLatch
、CyclicBarrier
等并发类均是基于AQS来实现的,具体用法是通过继承AQS实现其模板方法,然后将子类作为同步组件的内部类。