【问题标题】:What is the logic of a fail safe iterator?故障安全迭代器的逻辑是什么?
【发布时间】:2016-11-15 09:56:49
【问题描述】:

如果故障安全迭代器创建一个单独的副本并对其进行处理,它如何知道对原始副本所做的任何更改?

public class concurrentHashMap {
    public static void main(String[] args) throws InterruptedException {
        MapCheck obj1 = new MapCheck();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                obj1.put();
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                obj1.iterte();
            }
        });

        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}

class MapCheck {
    Map<Integer,String> map = new ConcurrentHashMap<>();
    {
        map.put(1, "pujan");
        map.put(2, "manish");
        map.put(3, "swati");
    }

    void iterte() throws InterruptedException {
        for (int key : map.keySet()) {
            Thread.sleep(2000);
            System.out.println(map.get(key));
        }
    }

    void put() throws InterruptedException{
        Thread.sleep(2000);
        map.put(1, "pujan1");
        map.put(2, "manish1");
        map.put(3, "swati1");
    }
}

输出是:

pujan1
manish1
swati1

【问题讨论】:

    标签: java collections iterator


    【解决方案1】:

    Java 中没有“故障安全”迭代器之类的东西。至少,Java SE 规范没有定义这样的术语。因此,我建议您避免使用术语“故障安全”来描述 Java 迭代器。

    我很清楚 Internet 上和 Stack Overflow 其他地方的各种文章都使用了“故障安全”一词,但它们的用法并不确定,而且很可能是不正确的,或者至少是误导性的。我相信你被这些文件误导了。

    听起来您在某处读到“故障安全”迭代器在单独的副本上工作。在您的示例中,您使用了ConcurrentHashMap,它确实具有不快速失败的迭代器。但是,CHM 的迭代器不对副本进行操作。相反,它们的语义被官方规范描述为weakly consistent。这个定义有点深奥,但本质上,这种迭代器报告的任何元素都保证在某个时间点存在于集合中。这些迭代器可能会也可能不会反映在迭代开始后对集合所做的更改。这就是为什么运行迭代器的线程会看到另一个线程所做的更改。 (由于这些线程存在数据竞争,因此部分更改或不可见更改也是可能的。)

    另一个迭代器不是快速失败的集合的示例是CopyOnWriteArrayList。此集合的迭代器在快照上运行,因此对集合的任何后续更改都从不通过迭代器可见。

    为了完整起见,这里是来自ArrayList 规范的fail-fast 迭代器的定义。 Java 中的大多数其他(非并发)集合都有类似定义的快速失败迭代策略。

    【讨论】:

      猜你喜欢
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      相关资源
      最近更新 更多