迭代时清除 ConcurrentHashMap 中的元素

Clear elements from ConcurrentHashMap while iterating

这是我对 ConcurrentHashMap 的测试

@Test
public void testIt2() {
    Map<String, String> map = new ConcurrentHashMap<String, String>();
    map.put("2", "2");
    map.put("1", "1");
    for (Entry<String, String> entry : map.entrySet()) {
        map.clear();
        System.out.println(entry.getKey());
    }
}

输出是:

1
2

为什么?

循环结束后可以看到变化。您可以再次打印地图以查看差异。它将是空的。我想添加一部分 @waldheinz's answer:

What happens if you put or remove a value from the map while iterating it?

如果您这样做,可以保证不会中断(这是 ConcurrentHashMap 中“并发”的一部分)。但是,无法保证一个线程会看到另一个线程对映射所做的更改(无需从映射中获取新的迭代器)。迭代器保证反映映射在创建时的状态。进一步的更改可能会反映在迭代器中,但并非必须如此。