java-一般同步列表问题
我有一个关于同步列表的一般性问题。java-一般同步列表问题,java,synchronized,Java,Synchronized,我有一个关于同步列表的一般性问题。 假设我在构造函数中创建了一个列表 List synchronizedList = Collections.synchronizedList(list); 我有一个方法将对象添加到列表中 public void add(String s){ synchronizedList.add(s) } 还有一个线程每隔几秒钟检查一次是否有几行,将其转储到一个文件并将其全部删除 现在让我们假设我迭代每一行并将其保存到数据库中。 在所有迭代之后,我清除了列表 多
假设我在构造函数中创建了一个列表
List synchronizedList = Collections.synchronizedList(list);
我有一个方法将对象添加到列表中
public void add(String s){
synchronizedList.add(s)
}
还有一个线程每隔几秒钟检查一次是否有几行,将其转储到一个文件并将其全部删除
现在让我们假设我迭代每一行并将其保存到数据库中。
在所有迭代之后,我清除了列表
多线程支持如何帮助我?我可以在另一个线程中出现clear()之前向列表中添加一个元素。
除非我自己管理锁(我真的不需要一个同步列表),否则我自己就可以了。由
集合返回的同步列表对您的情况没有帮助。只有当您需要保证对单个方法调用的串行访问时,它才是好的。如果需要围绕一组较大的操作进行同步,则需要手动将该代码包装到synchronized
块中。各国:
用户在遍历返回的列表时,必须手动同步该列表
如果您的列表在其他地方使用,您至少可以保护它不受单个方法调用的影响,否则这些方法调用将不会是线程安全的。但是,如果您完全管理列表,则只需将synchronized
块添加到add
方法中,并使用迭代时使用的锁。synchronizedList
实际上只保证列表上的每个方法调用都是同步的。如果需要以同步方式执行多个操作,则必须自己处理同步
顺便说一句,这是明确地说,在:
用户必须
在返回的文件上手动同步
在对其进行迭代时列出:
同步列表意味着该列表上的所有操作都保证是原子的。您描述的场景需要在列表之外有一些锁定。考虑信号量或使<代码>同步< /代码>块来实现监视器。看一看。由于所有三个答案都是状态,synchronized list意味着该列表上的所有操作都保证是原子的,或者保证对单个方法调用的串行访问。我不得不问我的同事这是什么意思。因此,这意味着(从上面的代码片段中)对列表的操作(如synchronizedList.size()
和synchronizedList.add)
不能并行。这对于一些正在阅读这篇文章的人来说并不明显。因此,尽管有必要增加帮助其他不理解的人。感谢@WhiteFang34、@jb nizet和@khachik提供以下解释。
List list = Collections.synchronizedList(new ArrayList());
...
synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}