【问题标题】:Semaphore(int permits, boolean fair), what does fairness precisely do?Semaphore(int permit, boolean fair),公平到底是做什么的?
【发布时间】:2018-01-23 12:01:20
【问题描述】:

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

Semaphore example = new Semaphore(5, true);

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

【问题讨论】:

    标签: java queue semaphore fifo


    【解决方案1】:

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

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

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

    当 fairness 设置为 true 时,信号量保证调用任何获取方法的线程被选择以按照处理它们调用这些方法的顺序获得许可(先进先出;FIFO)

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

    【讨论】:

    • 假设没有permit,4个线程尝试获取一个,会不会自动创建fifo队列?所以我不需要任何其他额外的结构?
    • @DarkPassenger 这就是文档所说的,除此之外,这是实现 IMO 公平的唯一合理方法
    • 最后一件事,如果我使用另一个构造函数:Semaphore(int permit),它会管理一个队列(不是FIFO)吗?
    • @DarkPassenger 这将是一个队列,是的,但不是 FIFO。我不知道它会是什么类型
    猜你喜欢
    • 2015-08-06
    • 2013-09-02
    • 2014-01-02
    • 2013-10-10
    • 2017-05-08
    • 2022-01-20
    • 2012-10-17
    • 2017-06-15
    • 2011-05-20
    相关资源
    最近更新 更多