为什么我需要同步Collections.synchronizedList返回的列表

Gab*_*lBB 19 java multithreading synchronization arraylist

我在dos.oracle.com找到了这个

public static List synchronizedList(列表列表)

返回由指定列表支持的同步(线程安全)列表.为了保证串行访问,必须通过返回的列表完成对后备列表的所有访问.当迭代它时,用户必须手动同步返回的列表:

  List list = Collections.synchronizedList(new ArrayList());
      ...
  synchronized(list) {
      Iterator i = list.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么我必须同步列表来迭代它,如果Collections.synchronizedList();它应该返回已经同步的列表?

我只是在两个线程中访问列表:一个线程只添加,另一个线程获取和删除.您建议在此方案中使用哪些其他类?

谢谢阅读.

ass*_*ias 24

该列表被同步只意味着add,remove等等操作是同步的,因此原子.然而迭代不是,如果一个线程adds而另一个迭代,你可能会得到一个ConcurrentModificationException.

通过手动同步迭代块,可确保在迭代时不修改列表.

一种替代方法是使用aCopyOnWriteArrayList提供迭代器,该迭代在迭代开始时已知的列表上迭代,而不管后续修改.但是,如果您需要经常更改列表的内容,那么该集合效率不高.

  • 因此,如果我必须添加synchronized(list){...} 块,那么我是否需要一个同步列表,或者我可以只使用该块内的普通ArrayList 吗? (2认同)
  • @Tobag你只需要使用synchronized关键字进行迭代 - "简单"操作,如添加,删除等都是原子的.如果使用ArrayList,则还需要同步这些调用. (2认同)