0

私は、クラスが非常に頻繁に読み取られるリストを保持しているが、たまにしか書き込まれない問題に取り組んでいます。私が正しく理解していれば、MyInterface が不変であると仮定すると、次のクラスはスレッドセーフであるはずです。

public class MyClass{
    private volatile ImmutableList<MyInterface> list = ImmutableList.of();

    public List<MyInterface> get(){
       return list;
    }

    public synchronized add(MyInterface obj)
       list = ImmutableList.builder().addAll(list).add(obj).build();
    }
}

しかし、誰かが MyInterface のミュータブルでスレッドセーフではないバージョンを実装している場合、失敗する可能性があります。この問題を解決するにはどうすればよいですか。最終クラスに対して実装することはできますが、これは本当にベスト プラクティスですか?

ありがとう!

4

3 に答える 3

0

同期メソッドを使用すると、スレッドが使用するミューテックスは「this」クラス (この場合は MyClass インスタンス) になります。したがって、メソッド全体が同期されるため、一度に 1 つのスレッドだけがアイテムをリストに追加できます。これは MyInterface とは関係ありません。この場合、これはメソッドのパラメーターにすぎません。

于 2012-09-12T19:18:04.510 に答える
0

MyInterface の実装の (im) 可変性は、ImmutableList 自体には影響しません。add() はオブジェクトのメソッドを呼び出しません。

于 2012-09-12T19:22:18.880 に答える
-1

まず、get() メソッドも MyClass で同期する必要があります。

さらに、Java 構文には、実装クラスに不変性を強制できるものは何もありません。適切なコーディング ガイドラインを作成することが重要です。

于 2012-09-12T19:23:01.497 に答える