的信号量被用于阻挡到物理或逻辑资源的某些部分螺纹级别的访问。信号量包含一组许可证; 每当线程试图进入临界区时,如果有可用许可证,它需要检查信号量。
如果没有许可证(通过tryAcquire()),则不允许该线程跳入临界区; 但是,如果许可证可用,则授予访问权限,许可证计数器减少。
一旦执行线程释放临界区,则许可计数器再次增加(由release()方法完成)。
我们可以使用tryAcquire(long timeout,TimeUnit unit)方法指定获取访问权限的超时。
我们还可以检查可用许可证的数量或等待获取信号量的线程数。
以下代码片段可用于使用实现信号量:
static Semaphore semaphore = new Semaphore(10);
public void execute() throws InterruptedException {
LOG.info("Available permit : " + semaphore.availablePermits());
LOG.info("Number of threads waiting to acquire: " +
semaphore.getQueueLength());
if (semaphore.tryAcquire()) {
semaphore.acquire();
// ...
semaphore.release();
}
}
我们可以使用Semaphore实现类似Mutex的数据结构。有关这方面的更多细节可以在这里找到。