Java:同步列表

时间:2014-03-13 16:21:16

标签: java multithreading list synchronization

我有一个ArrayList,我只在同步块中操作它,我是否也应该使用Collections.synchronizedList? 例如:

List list = Collections.synchronizedList(new ArrayList());    
// versus List list = new ArrayList();    
synchronized(list) {
      // my code
}

3 个答案:

答案 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复合操作的块