其他补充
我还提供了一些其他方法,用于实现更多的功能,详情如下:
- int availablePermits():返回此信号量中当前可用的许可证数。
- int getQueueLength():返回正在等待获取许可证的线程数。
- boolean hasQueuedThreads():是否有线程正在等待获取许可证。
- boolean isFair():查询 Semaphore 使用的是公平模式还是非公平模式,如果此信号量使用的是公平模式则返回 true。
- void release(int permits):释放给定数量的许可证,将其返回到信号量。
- tryAcquire():从这个信号量获得许可证,只有在调用时可以使用该许可证。
- tryAcquire(int permits):从这个信号量获取给定数量的许可证,只有在调用时全部可用。
- tryAcquire(int permits, long timeout, TimeUnit unit):从该信号量获取给定数量的许可证,如果在给定的等待时间内全部可用,并且当前线程尚未 interrupted。
- tryAcquire(long timeout, TimeUnit unit):如果在给定的等待时间内可用,并且当前线程尚未 到达 interrupted,则从该信号量获取许可。
- void reducePermits(int reduction) :减少可用的许可证数量 reduction 个,它是 protected 方法。
- Collection getQueuedThreads() :返回所有等待获取许可证的线程集合,它是 protected 方法。
总结
Semaphore 信号量是用来管理一组证书的,默认情况下它采取的是非公平的方式来管理证书,这样做的目的是为了实现高性能。Semaphore 中包含了两个重要的方法:
release() 方法发布一个许可证书;acquire() 方法阻塞并等待一个证书。当线程调用了 acquire() 方法只有拥有了证书才能继续执行,因此可以使用 Semaphore 来实现限流。