题
当许多线程访问 get 方法而只有一个线程访问 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()
不取决于 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