当许多线程访问 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top