多くの読者、一人の作家:これを同期する必要がありますか?
-
22-09-2019 - |
質問
多くのスレッドが get メソッドにアクセスし、1 つのスレッドだけが setList メソッドにアクセスしている場合、これを同期する必要がありますか?
public class ListContainer {
private List<String> myList = new ArrayList<String();
public List<String> get ( )
{
return new ArrayList<String>(myList);
}
public List<String> set ( )
{
this.myList = computeList();
}
}
読者が古いデータを取得しても気にしませんが、データには一貫性がある必要があります。
ヤニング
解決
同期する必要はありません(ただし、宣言する必要があります) myList
として volatile
) 次の条件が当てはまる場合:
computeList
現在の状態には依存しませんmyList
- 割り当てられた後にリストの内容を変更することはできません (
Collections.unmodifiableList(computeList())
この状態をより適切に表現する方法です)
他のヒント
いいえ、あなたはそこに同期を必要としません。 (computeList()
doesntのはmyList
に依存している場合)、任意の同時変更はなしにあります。
ところで、なぜあなたは、単にnew ArrayList(myList)
を返す代わりにmyList
を返却されますか?
それはcomputeListは限り何の同期の問題が発生しないことができます。myListのコンテンツへの読み取り専用アクセスがあったとして、はmyListに依存かしない問題かどうか。
myListのための揮発性を使用していない場合は、そのGETは、古います。myListを返すにもかかわらず、厳密セットがすでにリストに置き換えられてい発生する可能性があります。あなたはこの状況を気にしない場合は(それは別の値を見て二つのスレッドにつながる可能性がある)、そしてあなたは、揮発性の必要はありません。
私はむしろ
により暗黙のコピーを行うだろうpublic class ListContainer {
private final List<String> myList = new CopyOnWriteArrayList<String>();
public List<String> get (){
return myList;
}
public List<String> set (){
computeList();
}
}
HTH
所属していません StackOverflow