当前位置: 首页 > 知识库问答 >
问题:

Java公平信号量

郎聪
2023-03-14

我试图理解这个旧考试任务的答案,在这个任务中,学生应该使用JavasReentrantLock实现一个公平的二进制信号量。我不明白这些计数器的意义:

int next = 0;
int nextToGo = 0;
int myNumber; 

它在任务的描述中说,“你可以假设程序中使用信号量最多有20个线程。此外,最多1000万信号量操作将在程序的一次运行中执行。"在任务的解决方案中,它说:“每个试图获取信号量的线程必须在队列中注册自己,并且只有在之前的线程离开队列后才离开队列。每个线程使用32位计数器记住它在队列中的位置。计数器不会环绕,因为最多1000万操作将在信号量上执行,但是即使计数器可能环绕”,代码也能工作。

对我来说,老师似乎忽略了1000万线程在解决方案中的局限性,但我的主要问题是,当线程被放入锁()和等待()语句的队列中,并且有一个自由变量时,为什么需要计数器正在检查。而不是ReentantLock(真)照顾公平性?

解决方案:

public class FairSemaphore {

    ReentrantLock l = new ReentrantLock(true);
    Condition c = l.newCondition();
    int next = 0;
    int nextToGo = 0;
    boolean free = true;

    public void aqcuire() throws InterruptedException {
            l.lock();
            int myNumber = next++; 

            while(!(free && myNumber == nextToGo)) {
                    c.await();
            }
            free = false;
            nextToGo++;
            l.unlock();
    }

    public void release() {
            l.lock();
            free = true;
            c.signalAll();
            l.unlock();     
    }
}

共有1个答案

柳英资
2023-03-14

虽然您可能认为在ReentrantLock上阻塞的线程正在排队,但不能保证队列的行为与FIFO队列一样公平。文档明确告诉您:

...此锁不保证任何特定的访问顺序。。。但是请注意,锁的公平性并不能保证线程调度的公平性。。。

阅读整个文档,即使您创建了一个公平的可重入锁定,也不能保证它是公平的。

然而,所显示的代码确实表现得很好,因为计数器使线程以先进先出的顺序获取锁。

代码是一个票证锁,所以也检查了https://en.wikipedia.org/wiki/Ticket_lock

 类似资料:
  • 本文向大家介绍Java微信公众平台开发(1) 接入微信公众平台,包括了Java微信公众平台开发(1) 接入微信公众平台的使用技巧和注意事项,需要的朋友参考一下 前面几篇文章一直都在说微信公众平台的开发准备工作,那么从这篇开始我们就将正式的进入JAVA微信公众平台开发的整个流程,那么这篇我们开始聊聊如何将我们的服务端和微信公众平台对接! (一)接入流程解析 在我们的开发过程中无论如何最好的参考工具当

  • 方案1:将公众号授权给智齿 接入效果 授权过程 授权微信公众号给智齿需要智齿客服管理员和微信公众号管理员共同参与,具体步骤如下: 第一步:智齿客服管理员进入智齿管理后台「设置-支持渠道-微信」,点击「绑定公众号」进入授权页,可见微信授权二维码 ​ <微信公众号授权扫码页-电脑端> 第二步:由企业微信公众号管理员在微信端扫码、确认勾选授权哪些权限集给智齿并点击确认授权,完成授权后即算部署完成 ​ <

  • 微信公众号 微信公众号扫码授权以后,用户发往公众号的消息会转发给机器人,机器人会自动回复消息给公众号用户,同一个微信公众号同时只能绑定一个机器人,如果绑定了新的机器人,之前绑定的机器人会解除绑定。 注:微信公众号渠道接入后,仅支持微信文字,语音两种方式问答,用户在微信聊天框输入语音后,客服系统自动识别语音成文字进行答复。 只需三步接入微信公众号,自动回答公众号上的用户问题 1. 创建机器人 注册登

  • 我正在开发一个简单的信号量程序,其中我正在初始化一个计数为4的信号量,并启动6个线程。在run方法中,我获取信号量锁,在每个线程完成后,我释放锁。 这是我的代码: 结果如下: 现在,从java文档开始: java.util.concurrent.信号量。信号量(int许可,布尔公平) 使用给定的许可数量和给定的公平性设置创建信号量。 参数: 可用许可的初始数量。此值可能为负值,在这种情况下,必须在

  • 本文向大家介绍微信公众号开发之微信公共平台消息回复类实例,包括了微信公众号开发之微信公共平台消息回复类实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了微信公众号开发之微信公共平台消息回复类。分享给大家供大家参考。具体如下: 微信公众号开发代码我在网上看到了有不少,其实都是大同小义了都是参考官方给出的demo文件进行修改的,这里就给各位分享一个。 希望本文所述对大家基于PHP的微信公众号

  • 本章将介绍如何在您认证的微信公众号、订阅号中集成小能在线咨询功能 微信对接准备 微信对接模式介绍 微信授权模式 微信极速模式 微信开发模式-真Token方案 微信开发模式-假Token方案