rom*_*sky 65 java collections synchronization
List<String> list = Collections.synchronizedList(new ArrayList<String>());
synchronized (list) {
list.add("message");
}
Run Code Online (Sandbox Code Playgroud)
块"synchronized(list){}"真的需要吗?
Sam*_*erg 94
您不需要像放入示例中那样进行同步.但是,非常重要的是,在迭代时需要在列表周围进行同步(如Javadoc中所述):
当迭代它时,用户必须手动同步返回的列表:
Run Code Online (Sandbox Code Playgroud)List list = Collections.synchronizedList(new ArrayList()); ... synchronized(list) { Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); }
NPE*_*NPE 28
这取决于synchronized块的确切内容:
如果块在列表上执行单个原子操作(如在您的示例中),则这synchronized是多余的.
如果该块执行列表上的多个操作- ,需要维持用于化合物操作的持续时间的锁定 -则synchronized是不多余的.一个常见的例子是迭代列表.
ass*_*ias 21
Collections.synchronizedList add方法的底层代码是:
public void add(int index, E element) {
synchronized (mutex) {list.add(index, element);}
}
Run Code Online (Sandbox Code Playgroud)
因此,在您的示例中,不需要添加同步.