问题描述
|
我有一个关于同步列表的一般性问题。
可以说在构造函数中我正在创建一个列表
List synchronizedList = Collections.synchronizedList(list);
我有一种方法将对象添加到列表中。
public void add(String s){
synchronizedList.add(s)
}
还有另一个线程每隔几秒钟检查一次是否有几行,将其转储到文件中并将其全部删除。
现在说我迭代每一行并将其保存到数据库。
在所有迭代之后,我清除了列表。
多线程支持对我有什么帮助?
我可以在其他线程的clear()出现之前将元素添加到列表中。
除非我自己管理锁(我确实不需要该锁的同步列表),否则请自己锁。
解决方法
Collections
返回的同步列表在您的情况下无济于事。仅在需要保证对单个方法调用的串行访问时,这才是好。如果需要围绕更大的一组操作进行同步,则需要将该代码手动包装在“ 3”块中。 Javadoc指出:
当用户遍历返回列表时,必须手动对其进行同步。
如果您的列表在其他地方使用,则至少可以保护它免受可能不是线程安全的单个方法的调用。但是,如果您要完全管理该列表,则可以在add
方法中添加一个ѭ3and块,并使用迭代该锁时要使用的锁。
,synchronizedList
确实仅保证列表上的每个方法调用都同步。如果需要以同步方式完成多项操作,则必须自己处理同步。
顺便说一句,这在Collections.synchronizedList的javadoc中明确指出:
用户势在必行
手动同步返回的
迭代时列出:
List list = Collections.synchronizedList(new ArrayList());
...
synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
,同步列表意味着该列表上的所有操作都保证是原子的。您描述的方案需要在列表之外进行一些锁定。考虑使用信号量或制作“ 3”块来实现监视器。看一看java.util.concurrent。