Java多线程通信-Semaphore(信号量)

一、semaphone 信号量

  Semaphone (信号量)是一个同步工具类、用来控制同时访问某个资源的线程数量,还可以用来实现某些资源池、或者给容器添加边界。
  Semaphone管理着一组“虚拟”的许可(permit),许可的初始数量可通过构造函数来指定。操作之前可以先获得许可,并在操作结束之后释放许可。
acquire方法需要消耗一个许可,如果没有许可acquire将阻塞直到有许可(除非被中断、或者超时)可用。release方法则会添加一个许可。这里的许可,是一个虚拟的概念,并不存在一个名为“Permit"的对象,Semaphore只是记录可用的许可数量并执行相应的操作。

这里有两点需要注意:

  1. release会创建一个许可添加到信号量中,Semaphore中的许可数量并不受限于初始值,也就是说可以在Semaphore构造函数之后,调用release(int)增加许可数量。
  2. 如果一个线程因为没有许可而阻塞,在等待过程中被中断,accquire方法会抛出InterruptedException异常,并且清除中断状态、

Semaphore主要方法

方法 说明
void acquire() 消耗一个许可,无许可可用则阻塞,直到许可可用或者线程被中断
void acquire(int) 消耗多个许可,无足够许可则阻塞、直到有足够的许可可用或者被中断
void acquireUninterruptibly() 消耗一个许可 ,无许可则阻塞,并且线程被中断时会继续等待,
当该方法返回时,线程中标志会重置
void acquireUninterruptibly(int) 消耗多个许可 ,无许可则阻塞,并且线程被中断时会继续等待,
当该方法返回时,线程中标志会重置
boolean tryAcquire() 尝试获取一个许可,该方法不会阻塞,有许可则立即返回true,无许可则立即返回false。
即使在公平模式下&#x

你可能感兴趣的:(Java多线程,并发,java,Semaphore,多线程)