有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么在交互中的同步集合中再次同步?

在Java文档中,它说同步的集合必须在迭代中再次手动同步。为什么呢?因为返回的集合已经同步。我不太明白为什么会这样。多谢各位

 Collection c = Collections.synchronizedCollection(myCollection);
      ...
    synchronized(c) {
        Iterator i = c.iterator(); // Must be in the synchronized block
        while (i.hasNext())
          foo(i.next());
   }

共 (3) 个答案

  1. # 1 楼答案

    只有单个方法是同步的。如果允许代码的其他部分在迭代器中进行的调用之间调用这些方法,则会破坏列表的完整性,在这种情况下,同步变得毫无价值

    也许有一些方法不需要同步块,就可以使用synchronizedCollection包装列表(例如检查列表中有多少个元素),但是如果您使用的是列表,并且一个方法取决于另一个调用方法的精确结果,在两个方法调用周围都需要一个同步块,以确保在这些调用之间没有其他任何东西可以触及列表的状态

  2. # 2 楼答案

    原因是迭代操作不能保持列表上的锁。例如,i.hasNext()将锁定列表,直到检查hasNext()为止,但在您实际调用next()之前,列表可能会再次发生更改

    因此,您必须自己锁定列表,以保持整个迭代的同步,而不是单独执行每个操作

  3. # 3 楼答案

    假设iterator循环在两个不同的线程中运行。一个线程调用i.next().remove(),而另一个线程在同一个list上循环是完全合法的,这可能会破坏列表中数据的一致性