多线程下使用 ArrayList 中的 ListItetator 迭代器 出现的问题
public class IteratorTest {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
List<String> list = new ArrayList<>();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
list.add("zhaoliu");
list.add("tianqi");
ListIterator<String> iterator = list.listIterator();
cn.hutool.core.thread.ThreadUtil.execAsync(
()->{
try {
// 停留 300 ms 使得主线程读取到 modCount 的值
Thread.sleep(300);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// 添加一个元素 使得 modCount = 6
// 此时出现变量可见性问题
iterator.add("s");
}
);
// for (int i = 0; i < 1000; i++) {
// Field field = AbstractList.class.getDeclaredField("modCount");
// field.setAccessible(true);
// Object o = field.get(list);
// System.out.println("modCount = " + o); // modCount = 5
// }
while (iterator.hasNext()) {
System.out.println();
// 正常输出 不会报错
// 但是由于 add 方法是插入到 next 元素之前 所以无法打印出来
System.out.println(iterator.next());
}
}
}
在这种情况下 fast-fail 机制失效了,也就是 checkForComodification() 方法失效。 如何去解决这个问题呢
在写的时候 不让其他线程去读吗