Dar*_*ger 5 java queue semaphore fifo
如果信号量上没有可用的许可,我需要实现一个 FIFO 队列。我的教授指定在考试期间我们将只能使用acquire()和release()方法。我的想法是使用tryAcquire()如果结果为 false 将在 List 底部添加 currentThread的方法来实现 LinkedList 。无法使用tryAcquire()我搜索的方法,我注意到了这个结构。如果我初始化一个信号量,例如:
Semaphore example = new Semaphore(5, true);
Run Code Online (Sandbox Code Playgroud)
如果一个线程试图acquire()在一个已用尽其许可的信号量上使用方法,会发生什么?它会自动创建队列吗?我必须以任何方式处理它还是该过程是自动的?
java doc不是以这种方式明确的吗?
它表示线程调用acquire将被阻塞,直到有许可可用为止,而不是tryAcquire返回 false - 意味着没有许可,但调用此方法的线程不会阻塞。
公平性是相关的。如果已经有等待线程但您tryAcquire通过当前线程,它将忽略公平性并获得许可。既然不允许你使用它,那么公平就是你要寻找的 FIFO 队列。从文档的字面上看:
当公平性设置为 true 时,信号量保证选择调用任何 acquire 方法的线程,以按照处理这些方法的调用的顺序获取许可(先进先出;先进先出;FIFO)
如果存在被阻止的线程,解除阻止的两种方法是通过添加许可release或中断线程 - 我认为您不希望这样做。