[英]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.