0

ここでの目標が、リストがシリアル化されてファイルに書き込まれている間、リストに変更が加えられていないことを確認することである場合、どの方法がより良い仕事をしますか?

private void save() throws IOException {
    FileUtils.deleteQuietly(f);
    synchronized (list_of_important_data) {
        FileManipulationUtils.writeObject(list_of_important_stuff, MY_FILE);
    }
}

private void synchronized save() throws IOException {
    FileUtils.deleteQuietly(f);
    FileManipulationUtils.writeObject(list_of_important_stuff, MY_FILE);
}

説明されている目的のために、両方とも同じことをしますか?一方はもう一方よりも優れていますか?

4

2 に答える 2

1

彼らはまったく同じことをしません。

最初のものはリスト上で同期します。save()を呼び出したオブジェクトの2番目。それらは異なるオブジェクトで同期するため、異なる並行性の競合に対して防御します。

1つ目は、リストが保存されている間、リストの変更から保護します。ただし、すべての変更機能/アクセスが同様に同期されている必要があります。

2つ目は、save()がそれ自体と同時に実行されること、または(さらに重要なことに)保存されたオブジェクトで同期される他のメソッドから保護します。

どちらが他よりも優れているかを尋ねるのは賢明ではありません。それらはリモートで同じことをすることすらしないので、リモートで比較することはできません。どちらが最適かは、最初に同期することによって何を達成しようとしているのかによって異なります。

あなたの質問の混乱を考えると、答えは「上記のどれでもない」かもしれないと私は思う、そして実際あなたはあなたの並行性の設計を再考する必要がある。それを支援するために、私たちはあなたのコードをもっと見て、あなたが何を達成しようとしているのかをよりよく理解する必要があります。

于 2013-01-15T03:50:02.430 に答える
0
    private void synchronized save() throws IOException {
        FileUtils.deleteQuietly(f);
        FileManipulationUtils.writeObject(list_of_important_stuff, MY_FILE);
    }

と同じです

    private void save() throws IOException {
        synchronized(this){
            FileUtils.deleteQuietly(f);
            FileManipulationUtils.writeObject(list_of_important_stuff, MY_FILE);
        }
    }

ロックを選択してください-短いもの

于 2013-01-15T03:47:32.327 に答える