为什么同步同步列表?

时间:2015-02-06 19:57:12

标签: java collections concurrency

如果我创建这样的列表:

List<MyObj> myobjs = Collections.synchronizedList(new ArrayList<MyObj>()); 

相关文档声称需要同步此返回列表以迭代元素。然而,我可以同步常规List并使用synchronized块保护它。那么,为什么我需要一个&#34; synchronizedList&#34;?

  

返回由指定的支持的同步(线程安全)列表   名单。为了保证串行访问,所有这一切至关重要   访问后备列表是通过返回的列表完成的。

     

用户必须手动同步返回的内容   迭代时列出:

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

不遵循此建议可能会导致不确定性   行为。如果指定的列表,返回的列表将是可序列化的   是可序列化的。

     

参数:列出要包含的列表&#34;在同步列表中。   返回:指定列表的同步视图。

1 个答案:

答案 0 :(得分:3)

synchronizedList是一个便利包装器,允许您在大多数情况下避免手动同步,但在迭代时不会。

使用正常的非同步列表,如果多个线程使用它,则需要始终手动同步,因此使用synchronizedList非常方便。

如果您将列表传递给某些未在列表中同步但仍需要同步的第三方代码,则可能需要synchronizedList。但是,这很容易出错,因为您依赖于第三方代码不会遍历列表或使用其他非原子操作的事实,因此如果可能的话,最好完全避免这种情况(例如,通过复制列表)。