Semaphore(int permits, boolean fair),公平性在这里究竟是什么意思?

5

如果信号量上没有可用的许可,我需要实现一个FIFO队列。 我的教授规定在考试期间只能使用acquire()release()方法。 我的想法是使用tryAcquire()方法来实现一个LinkedList,如果结果为false,则将当前线程添加到列表底部。 由于无法使用tryAcquire()方法,我搜索并发现了这个结构。 例如,如果我初始化一个信号量:

Semaphore example = new Semaphore(5, true);

如果一个线程尝试在已经用完许可的信号量上使用acquire()方法,会发生什么? 它会自动创建队列吗? 我需要以任何方式处理它还是过程自动进行?

1个回答

2
Java文档是否明确表明了这一点?
它说调用acquire的线程将被阻塞,直到有一个许可证可用,而不是tryAcquire,后者将返回false-这意味着没有许可证,但调用此方法的线程不会被阻塞。
公平性是相关的。如果已经有等待的线程,但您通过当前线程尝试tryAcquire,它将忽略公平性并获取该许可证。由于您不被允许使用它,因此公平性是您要寻找的FIFO队列。从文档中字面上可以看出:
当设置公平性为true时,信号量保证调用任何获取方法的线程按照处理这些方法的调用顺序(先进先出;FIFO)选择获得许可。
如果有阻塞的线程,则解除阻塞的两种方法是通过release添加许可或中断线程-我认为您不想这样做。

假设没有许可证,有4个线程尝试获取一个,它会自动创建一个FIFO队列吗?因此我不需要任何其他附加结构吗? - DarkPassenger
@DarkPassenger 这就是文档所说的,除此之外,在我看来这也是实现公平性的唯一合理方式。 - Eugene
如果我使用另一个构造函数:Semaphore(int permits),它会管理一个队列(不是FIFO)吗? - DarkPassenger
@DarkPassenger 是一个队列,但不是FIFO。我不知道它会是什么类型。 - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接