Java 信号量中的多线程概念

Java multithreading concepts in Semaphores

我创建了一个信号量

Semaphore semaphore =  new Semaphore(1);

我们重载了 aquire 方法,例如:

aquire()
aquire(int)

Q1 :对于目前只有1个permit的semaphore,第二种方法(aquire(int))有什么意义吗?

Q2:我对

还是有点迷惑
new Semaphore(int)
new Semaphore(int,true)
new Semaphore(int, false)

问题 3: 如果我调用 release(),而不调用 aquire(),许可数量会发生什么变化,是否比我们声明的增加?

注意:有多个线程共享 Semaphore 对象。

感谢任何帮助。

如果您的 Semaphore 以单个许可开始并且单个线程试图获取超过 1 个许可,则该线程将阻塞。假设没有其他线程会调用必要数量的 release,那么该线程将被无限期地阻塞。

overloaded constructorboolean 参数表示

if this semaphore will guarantee first-in first-out granting of permits under contention, else false

您在构造函数中指定的许可数量只是初始数量,不是限制。

Q2: I am still a bit confused with

new Semaphore(int)          //same as new Semaphore(i, false);
new Semaphore(int,true)     //the Semaphore will be "fair".
new Semaphore(int, false)   //the semaphore will not be "fair".

布尔标志控制信号量是否公平。 "Fair" 表示当有多个线程被阻塞等待获取许可时,等待的线程将按照严格的先到先得顺序到达 运行。第一个被阻塞的线程将是第一个到 运行 的线程,依此类推。

当信号量公平时,它可能会通过一种算法来实现,与某些计算机体系结构上的公平算法相比,它可能会提供更高的性能。