Semaphore,CountDownLatch,CyclicBarrier 均是 JDK1.5 提供的基础并发工具:
- Semaphore 是一个计数信号量,用于限制同时访问某个特定资源的数量
- CountDownLatch 是一个闭锁,允许一个或多个线程等待一组其他线程执行完成后执行,但只能使用一次
- CyclicBarrier 是一个循环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行,并且支持重复使用
Semaphore
1 | class X{ |
这是 Semaphore 的一个标准的使用方式,用于控制流量。上述程序创建了一个允许 10 个线程同时访问的信号量,并且使用公平锁(一般来说用于控制流量的使用需要使用公平模式,用于防止线程饥饿),然后在提供获取资源的接口 getNextAvailableItem 方法前先获取凭证,在释放资源后释放凭证。但是注意 Semaphore 不保证并发正确性,这需要接口自己保证,因此这里使用 synchronized 来提醒这一点。