繁体   English   中英

调用 RMI 方法会释放同步锁吗?

[英]Does calling an RMI method free the synchronized lock?

我调用了一个 RMI 方法,它位于一个同步块中。 像这样,其中方法appendEntries是被调用的 RMI 方法:

public void run() {
    synchronized(matchIndex.get(followerId)) {
        ArrayList<Entry> reqs = new ArrayList<>();
        for (int i = matchIndex.get(followerId) + 1; i <= log.lastIndex(); i++) {
            reqs.add(log.get(i));
        }
   
        try {
            answer = server.serverList.get(followerId).appendEntries(reqs);
            if (answer.isSuccessful()) {
                matchIndex.replace(followerId, matchIndex.get(followerId) + reqs.size());
            } else {
                System.out.println("Not Successfull.");
            }
        } catch (Exception e) {
            e.printStackTrace();    
        }
    }
}    

当这个线程正在等待 RMI 方法的答案时,它是否释放了matchIndex.get(followerId)的锁?

为了更好的背景下,我问这个是因为,很显然,与正在使用的各种线程,没有不成功的答案,总会有两个线程都呼吁同appendEntries随机点followerId ,然后在一个共同的输入reqs ,这不应该发生,我怀疑这就是原因。

如果你需要进一步的解释,我正在为一个班级项目实现共识算法 Raft。 如果您不熟悉它,基本上这段简化的代码是“领导者”逻辑的一部分,他必须将其日志中的条目发送给他的“追随者”。 领导者和追随者上的日志必须最终一致。 这段代码位于一个线程上,当“领导者”想要将其日志条目发送给特定的追随者时会调用该appendEntries ,但他不应为每个追随者一次多次调用appendEntries方法。 matchIndex是领导者知道的每个跟随者的最后一个条目的位置。

我希望它不是太多或太少的信息,这是我使用本网站多年后的第一个 Stack Overflow 问题,任何帮助将不胜感激。

正如@NathanHughes 所指出的,我的问题是我在具有锁的对象上使用了 replace 方法,它搞砸了同步。 我创建了一个专门用于锁定目的的新对象数组,现在它可以完美地工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM