Collections.synchronizedList和同步

List<String> list = Collections.synchronizedList(new ArrayList<String>()); synchronized (list) { list.add("message"); } 

这个块“synchronized(list){}”真的需要在这里吗?

你不需要像你放入你的例子那样同步。 然而,非常重要的是,当你迭代它的时候,你需要在列表中进行同步(如Javadoc中所述):

迭代时用户手动同步返回列表是非常重要的:

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

这取决于synchronized块的确切内容:

  1. 如果块在列表上执行单个primefaces操作(如您的示例中所示),则synchronized是多余的。

  2. 如果块在列表上执行多个操作, 并且需要在复合操作期间保持locking状态,那么synchronized 并不是多余的。 一个常见的例子就是迭代列表。

Collections.synchronizedList add方法的底层代码是:

 public void add(int index, E element) { synchronized (mutex) {list.add(index, element);} } 

所以在你的例子中,不需要添加同步。

另外需要注意的是,任何使用迭代器(例如Collections.sort())的方法也需要封装在一个同步块中。

阅读这个Oracle Doc

它说:“迭代时用户手动同步返回列表是非常重要的”