问题已编辑:
HashSet 和 HashMap 是快速失败的(但这不是保证的),如代码中所述:
void goHashSet() {
Set set = new HashSet();
for (int i = 1; i <= 10; i++) {
set.add(i);
}
Iterator i = set.iterator();
while (i.hasNext()) {
// set.add(16);//Exception in thread "main"
// java.util.ConcurrentModificationException
System.out.println("HashSet >>> itertor >>>" + i.next());
}
}
现在,我想要我所知道的故障安全的示例和集合
:ConcurrentHashMap,CopyOnWriteArrayList 是故障安全的..但是如何对其进行编码以表明它们是故障安全的
编辑和理解我想要什么以及我是如何实现它的:
如果我们使用 HashMap
void goHashMap() {
Map mp = new HashMap();
for (int i = 19; i <= 24; i++) {
mp.put(i, "x");
}
Set setKeys = mp.keySet();
Iterator i = setKeys.iterator();
while (i.hasNext()) {
// mp.put(499, "x");// Exception in thread "main"
// java.util.ConcurrentModificationException
System.out.println("HashMap >>> itertor >>>" + i.next());
}
}
我们得到 ConcurrentMException
但是使用 ConcurrentHashMap 完成相同的代码,没有错误(非多线程环境)
void goConcurrentHashMap() {
Map mp = new ConcurrentHashMap();
for (int i = 19; i <= 24; i++) {
mp.put(i, "x");
}
Set setKeys = mp.keySet();
Iterator i = setKeys.iterator();
while (i.hasNext()) {
mp.put(499, "x");
System.out.println("HashConcurrentMap >>> itertor >>>" + i.next());
}
}
更重要的是:在多线程环境中,ConcurrentHashmap 可能会快速失败并抛出异常 CME