java - Semaphore(int permits, boolean fair),fairness到底是做什么的?

标签 java queue semaphore fifo

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

Semaphore example = new Semaphore(5, true);

如果一个线程试图在一个已用尽许可的信号量上使用 acquire() 方法会发生什么?它会自动创建队列吗?我必须以任何方式处理它还是自动处理?

最佳答案

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

它表示调用acquire 的线程将被阻塞,直到获得许可为止,而tryAcquire 将返回false——这意味着没有许可,但是调用此方法的线程不会阻塞。

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

When fairness is set true, the semaphore guarantees that threads invoking any of the acquire methods are selected to obtain permits in the order in which their invocation of those methods was processed (first-in-first-out; FIFO)

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

关于java - Semaphore(int permits, boolean fair),fairness到底是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48401242/

相关文章:

java - 从我的用户/主类控制链表队列,不起作用

c - 在多个进程之间共享 POSIX 信号量

java - 如何在具有相同回调签名的 .dll 和 .so 中使用 JNA

多行 Java 标签

C++队列模板

sql - 从自定义队列中选择下一条消息的性能缓慢

c - semctl GETVAL 无法读取信号量值

使用信号量和监视器的 Java Unisex 浴室

java - 如何在基于 Spring 注释的 java 配置中设置 Activity 配置文件

java - Jmeter - OpenJDK : java. lang.module.FindException : Module java. 未找到激活