java - general synchronizedList问题

时间:2011-05-24 07:19:03

标签: java synchronized

我对同步列表有一般性问题 让我们说在构造函数中我正在创建一个列表

List synchronizedList = Collections.synchronizedList(list);

我有一个方法将一个对象添加到列表中。

public void add(String s){ 
    synchronizedList.add(s)
}

如果有几行,还有另一个线程会每几秒检查一次,将其转储到文件中并将其全部删除。

现在假设我迭代每一行并将其保存到数据库中。 在所有迭代之后我清除列表。

多线程支持如何帮助我? 我可以在另一个线程中的clear()之前添加一个元素到列表中 除非我自己管理锁(我真的不需要一个同步列表),我自己。

3 个答案:

答案 0 :(得分:13)

Collections返回的同步列表对您的情况无济于事。如果您需要保证对单个方法调用的串行访问,这是唯一的好处。如果需要围绕更大的操作集进行同步,则需要手动将该代码包装在synchronized块中。 Javadoc州:

  

当迭代它时,用户必须手动同步返回的列表。

如果您的列表在其他地方使用,您至少可以保护它免受单独的方法调用,否则这些调用将不是线程安全的。但是,如果您完全管理列表,则可以在synchronized方法中添加add块,并使用在迭代时使用的相同锁定。

答案 1 :(得分:13)

synchronizedList确实只保证列表上的每个方法调用都是同步的。如果您需要以同步方式完成多个操作,则必须自己处理同步。

顺便说一句,这在javadoc for Collections.synchronizedList中明确表示:

  

用户势在必行   手动同步返回   迭代时列出:

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

答案 2 :(得分:4)

synchronized list意味着该列表上的所有操作都保证是原子的。您描述的方案需要在列表外部进行一些锁定。考虑信号量或使synchronized阻止实现监视器。看看java.util.concurrent