信号量(int permits,布尔公平),公平性究竟有什么作用?



如果信号灯上没有可用的许可证,我需要实现FIFO队列。 我的教授指定,在考试期间,我们将只能使用acquire()release()方法。 我的想法是使用tryAcquire()方法实现一个 LinkedList,如果结果为 false,则会在列表底部添加 currentThread。 无法使用我搜索的tryAcquire()方法,我注意到了这个结构。 如果我初始化信号灯,例如:

Semaphore example = new Semaphore(5, true);

如果线程尝试在已用尽其许可的信号量上使用acquire()方法,会发生什么情况?它会自动创建队列吗?我是否必须以任何方式处理它或该过程是自动的?

java文档不是以这种方式显式的吗?

它说线程调用acquire将被阻止,直到许可证可用,而不是返回 false 的tryAcquire- 这意味着没有许可证,但调用此方法的线程不会阻止。

公平是相关的。如果已经有等待线程,但您通过当前线程tryAcquire,它将忽略公平性并获得该许可。由于您不被允许使用它,因此公平性是您正在寻找的FIFO队列。从字面上看,来自文档:

当公平性设置为 true 时,信号量保证选择调用任何获取方法的线程,以按照其对这些方法的调用的处理顺序(先进先出;先进先出)

如果有阻塞的线程,取消阻止它们的两种方法是通过release添加许可或中断线程 - 我认为您不想这样做。

最新更新