web-dev-qa-db-ja.com

インターンされた文字列で同期するときのパフォーマンスの問題

Javaを使用して文字列「ip + filename」でリモートファイルをロックしたい。

public boolean execCmd(String ip,String filename, String command)
{
    String file = ip + filename;
    String lock = file.intern();

    try
    {
        synchronized (lock)
        {
            System.out.println(file + "get the lock");
            // ssh to remote machine and exec command
            System.out.println(file + "release the lock");
        }
    }
    catch(Exception e)
    {
    }
}

この関数はマルチスレッドによって呼び出されますが、実行が少し遅いことがわかりました。異なるファイルに対してもシーケンシャルのようです。

結果は次のようになります。

file1 get the lock
file2 get the lock
file3 get the lock
file1 release the lock
file2 release the lock
file3 release the lock
file4 get the lock
file4 release the lock
file5 get the lock
file5 release the lock
file6 get the lock
file6 release the lock
...

最初の3つのログ出力は同時のようですが、次のタスクは順次のようです。何度も試しましたが、結果はほぼ同じです。

これは正常な結果ですか?またはプログラムに何か問題がありますか?

2
NingLee

あなたのコードは正しいですが、String.intern()で同期するのは良い考えではありません。

ちなみに、リモートマシンでファイルをロックしたい場合は、シェルスクリプトで実装できます。 flockは、Linuxでファイルをロックするための良い方法です。

1
shangyin