我有一个ArrayList,我只在同步块中操作它,我是否也应该使用Collections.synchronizedList? 例如:
List list = Collections.synchronizedList(new ArrayList());
// versus List list = new ArrayList();
synchronized(list) {
// my code
}
答案 0 :(得分:1)
只需使用synchronized声明,不需要显式同步块:
List list = Collections.synchronizedList(new ArrayList());
更改列表内容的唯一方法是调用add或remove,由于此声明,现在使用这些方法的同步版本进行修饰。
答案 1 :(得分:1)
使用明确的synchronized
块并使用Collections.synchronizedList(new ArrayList())
将在互斥方面同等地运作。但是,如果您必须遍历调用Collections
所返回的列表,那么无论如何, 必须 在外部显式同步, java规范(对不起,SO赢了,不让我在这里链接到它)。
要考虑的另一件事是开销。 Collections.synchronizedList(List orig)
创建一个新对象,用于控制对原始列表实现的访问。根据您计划进行此调用的频率以及访问原始列表对象的方式,您可能最好不要在外部进行同步。
答案 2 :(得分:1)
如果您只在synchronized
个区块内访问您的列表,则不需要synchronizedList()
如果您只使用基本操作(add()
,remove()
等)访问您的列表,并且这些操作的调用并不相互依赖(即原子性不是问题),您只能使用synchronizedList()
而不使用明确synchronized
块
如果您希望能够在没有synchronized
块的情况下调用基本操作,但也需要具有原子的复合操作(包括迭代),则需要synchronizedList()
和{{1复合操作的块