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
块的确切内容:
-
如果块在列表上执行单个primefaces操作(如您的示例中所示),则
synchronized
是多余的。 -
如果块在列表上执行多个操作, 并且需要在复合操作期间保持locking状态,那么
synchronized
并不是多余的。 一个常见的例子就是迭代列表。
Collections.synchronizedList add方法的底层代码是:
public void add(int index, E element) { synchronized (mutex) {list.add(index, element);} }
所以在你的例子中,不需要添加同步。
另外需要注意的是,任何使用迭代器(例如Collections.sort())的方法也需要封装在一个同步块中。
阅读这个Oracle Doc
它说:“迭代时用户手动同步返回列表是非常重要的”