调用 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) 中的锁?

为了更好的上下文,我问这个是因为,显然,在使用各种线程并且没有不成功的答案的情况下,出现一个随机点,其中两个线程正在为相同的 followerId 调用 appendEntries,然后是一个公共条目在 reqs 中,这不应该发生,我怀疑这就是原因。

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

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

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