Java多线程六脉神剑


theme: smartblue


前言

少冲剑:少冲剑轻灵迅速,Semaphore 用于控制资源的访问数量,操作灵活迅速。

Semaphore(信号量):Semaphore用于控制线程的并发数量,规定一个公共资源同一时间能够多少线程访问。在Semphore初始化时指定“许可”数量,这个数量代表同一时间能够访问资源的线程数量,当一个线程调用acquire尝试获取许可时,如果获取成功,许可数量减一;当许可已分配完了,获取失败,线程阻塞等待,只有当其他线程调用release释放许可时,才有机会获取成功。

image.png

Semaphore常用方法详解

  • acquire:尝试获取一个许可,如果没有可用许可则阻塞等待,直到获取到许可或被中断。
  • acquire(int permits):尝试获取permits数量的许可,如果没有足够的许可则阻塞,直到获取到足够的许可或被中断。
  • tryAcquire():尝试获取一个许可,获取成功返回true,失败返回false,不会阻塞。
  • tryAcquire(int permits, long timeout, TimeUnit unit):尝试在指定时间内获取permits数量的许可,获取成功返回true,失败返回false,不会阻塞。
  • release():释放一个许可。
  • release(int permits): 释放permits数量许可。
  • availablePermits():返回当前可用许可数量。
  • drainPermits():将可用许可数量设置为0,并返回当前可用许可数量。
  • hasQueuedThreads():判断是否有线程正在等待获取许可。
  • getQueueLength():返回正在等待获取许可的线程数量。
  • isFair():判断该Semaphore是否是公平模式。公平模式下,等待时间最长的线程会优先获取许可;非公平模式则不一定。
  • getQueuedThreads():返回一个包含所有正在等待获取许可的线程的Collection。举个栗子