Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java-一般同步列表问题_Java_Synchronized - Fatal编程技术网

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