簡體   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