2011-05-24 72 views
7

我有关于同步列表的一般问题。
比方说,在构造函数中,我createing列表java - 一般synchronizedList问题

List synchronizedList = Collections.synchronizedList(list); 

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

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

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

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

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

+0

由于所有三个答案都表示,同步列表意味着该列表上的所有操作都保证是原子的或保证对各个方法调用的串行访问。我不得不问我的同事这是什么意思。所以它意味着List上的操作像(从上面的代码片段)'synchronizedList.size()'和'synchronizedList.add(s)'不能并行。对于正在阅读此主题的某些人而言,这并不明显。所以虽然增加了帮助其他谁不明白。谢谢@ WhiteFang34,@ jb-nizet和@khachik的解释如下。 – 2014-12-17 18:34:03

回答

13

Collections返回的同步列表不会帮助您的情况。如果您需要保证对单个方法调用的串行访问,这样做是非常好的。如果您需要同时执行一组较大的操作,则需要手动将该代码包装在​​区块中。 Javadoc指出:

用户在迭代它时手动同步返回的列表是非常重要的。

如果您的列表在其他地方使用,至少可以保护它不受线程安全的个别方法调用。但是,如果您完全管理列表,则只需将​​块添加到add方法中,并使用您在迭代时使用的同一个锁。

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()); 
    } 
4

同步列表意味着该列表上的所有操作都保证是原子的。你描述的场景需要在列表之外锁定一些。考虑信号量或使​​块来实现监视器。看看java.util.concurrent