Update:
其实发现semaphore这种permit的数量,更好理解的方式是“拥有做xxx的权利”,“能够做xxx”这种;比上锁要好


以下是原文:

信号量Semaphore

  1. Semaphore信号量作为一种流控手段,可以对特定资源的允许同时访问的操作数量进行控制,例如池化技术(连接池)中的并发数,有界阻塞容器的容量等
  2. 包含初始化时固定个数的许可,在进行操作的时候,需要先acquire获取到许可,才可以继续执行任务,如果获取失败,则进入阻塞;处理完成之后需要release释放许可
  3. acquire与release之间的关系:在实现中不包含真正的许可对象,并且Semaphore也不会将许可与线程关联起来,因此在一个线程中获得的许可可以在另一个线程中释放
  4. 将acquire操作视为是消费一个许可,而release操作是创建一个许可
  5. 根据上面的说法,所以是可以初始化的时候没有semaphore, 但是后面直接release()创建一个permit的;因为此时实际上并不是非要之前acquire()此时才能release(), 而是release()直接作为创建一个permit
  6. Semaphore 是 synchronized 的加强版,作用是控制线程的并发数量。就这一点而言,单纯的synchronized 关键字是实现不了的

Constructor details:

1
2
3
public Semaphore(int permits)

public Semaphore(int permits, boolean fair)

  • permits: the initial number of permits available. This value may be negative, in which case releases must occur before any acquires will be granted.
  • fair: true if this semaphore will guarantee first-in first-out granting of permits under contention, else false