java-常规syncList问题

问题描述

| 我有一个关于同步列表的一般性问题。 可以说在构造函数中我正在创建一个列表
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。