迭代时清除 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
中“并发”的一部分)。但是,无法保证一个线程会看到另一个线程对映射所做的更改(无需从映射中获取新的迭代器)。迭代器保证反映映射在创建时的状态。进一步的更改可能会反映在迭代器中,但并非必须如此。
这是我对 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
中“并发”的一部分)。但是,无法保证一个线程会看到另一个线程对映射所做的更改(无需从映射中获取新的迭代器)。迭代器保证反映映射在创建时的状态。进一步的更改可能会反映在迭代器中,但并非必须如此。