seeyoulater1 2023-07-28 16:00 采纳率: 76.9%
浏览 7
已结题

多线程下使用 ArrayList 中的ListItetator 迭代器 出现的问题

多线程下使用 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() 方法失效。 如何去解决这个问题呢
在写的时候 不让其他线程去读吗

  • 写回答

2条回答 默认 最新

  • 家有娇妻张兔兔 Java领域优质创作者 2023-07-28 16:07
    关注

    用CopyOnWriteArrayList 这个是线程安全的,避免多个线程同时修改集合。
    或者用同步块或者锁
    使用 ListIterator 迭代器时,在迭代过程中修改集合,会导致 fast-fail 机制失效

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月28日
  • 已采纳回答 7月28日
  • 修改了问题 7月28日
  • 创建了问题 7月28日

悬赏问题

  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥20 python忆阻器数字识别
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api