我对同步列表有一般性问题 让我们说在构造函数中我正在创建一个列表
List synchronizedList = Collections.synchronizedList(list);
我有一个方法将一个对象添加到列表中。
public void add(String s){
synchronizedList.add(s)
}
如果有几行,还有另一个线程会每几秒检查一次,将其转储到文件中并将其全部删除。
现在假设我迭代每一行并将其保存到数据库中。 在所有迭代之后我清除列表。
多线程支持如何帮助我? 我可以在另一个线程中的clear()之前添加一个元素到列表中 除非我自己管理锁(我真的不需要一个同步列表),我自己。
答案 0 :(得分:13)
Collections
返回的同步列表对您的情况无济于事。如果您需要保证对单个方法调用的串行访问,这是唯一的好处。如果需要围绕更大的操作集进行同步,则需要手动将该代码包装在synchronized
块中。 Javadoc州:
当迭代它时,用户必须手动同步返回的列表。
如果您的列表在其他地方使用,您至少可以保护它免受单独的方法调用,否则这些调用将不是线程安全的。但是,如果您完全管理列表,则可以在synchronized
方法中添加add
块,并使用在迭代时使用的相同锁定。
答案 1 :(得分:13)
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。