ConcurrentModificationException 仅在 Java 1.8.0_45 中

2023-12-11

我对这段代码有两个问题:

import java.util.*;

public class TestClass {

    private static List<String> list;   
    public static void main(String[] argv) {

        list = generateStringList(new Random(), "qwertyuioasdfghjklzxcvbnmPOIUYTREWQLKJHGFDSAMNBVCXZ1232456789", 50, 1000);

//      Collections.sort(list, new Comparator<String>() {
//          public int compare(String f1, String f2) {
//              return -f1.compareTo(f2);
//          }
//      });

        for (int i = 0; i < 500; i++) {
            new MyThread(i).start();
         }

    }

    private static class MyThread extends Thread  {
        int id;
        MyThread(int id) { this.id = id; }
        public void run() {

            Collections.sort(list, new Comparator<String>() {
                public int compare(String f1, String f2) {
                    return -f1.compareTo(f2);
                }
            });

            for (Iterator it = list.iterator(); it.hasNext();) {
                String s = (String) it.next();
                try {
                    Thread.sleep(10 + (int)(Math.random()*100));
                }catch (Exception e) { e.printStackTrace(); }

                System.out.println(id+" -> "+s);
            }           
        }       
    }

    public static List<String> generateStringList(Random rng, String characters, int length, int size)
    {
        List<String> list = new ArrayList<String>();
        for (int j = 0; j < size; j++) {
            char[] text = new char[length];
            for (int i = 0; i < length; i++)
            {
                text[i] = characters.charAt(rng.nextInt(characters.length()));
            }
            list.add(new String(text));
        }
        return list;
    }
}

在 java 1.8.0_45 上运行此代码我得到java.util.ConcurrentModificationException.

1)如果我在 thread.start 之前取消排序,为什么我也会得到异常?

2)为什么我只在java 1.8.0_45上遇到异常?在 1.6.0_45、1.7.0_79、1.8.0_5 上工作正常。


@nbokmans已经确定了一般原因为什么你会得到这个例外。然而,这似乎确实与版本有关。我将解释为什么你在 java 8.0_45 中得到它,但在 1.6.0_45、1.7.0_79、1.8.0_5 中却没有。

这是因为 Collections.sort() 在 java 8.0_20 中发生了更改。有一篇文章对此有深入的了解here。在新版本中,按照文章的说法,排序是这样的:

public void sort(Comparator<? super E> c) {
  final int expectedModCount = modCount;
  Arrays.sort((E[]) elementData, 0, size, c);
  if (modCount != expectedModCount) {
    throw new ConcurrentModificationException();
  }
  modCount++;
}

就像文章解释的那样:

与旧的 Collections.sort 相反,此实现修改了 列表完成后,集合的 modCount(上面第 7 行) 已排序,即使结构本身没有真正改变(仍然是 相同数量的元素)。

因此,即使集合已经排序,它也会进行内部更改,而在更改之前它不会这样做。这就是为什么你现在得到例外。

实际的修复是不要同时使用多个线程对集合进行排序。你不应该这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ConcurrentModificationException 仅在 Java 1.8.0_45 中 的相关文章

随机推荐

  • rPython 包无法在 R Shinyshinyapps.io 上安装

    shinyapps io 服务器没有安装 python 吗 因为包rPython安装失败 需要安装python 如果答案是否定的 我觉得很奇怪 因为 RStudio 本身有蟒蛇支持 shinyapps io 服务器是否支持 python 或
  • 在 Google Cloud Platform 存储桶上托管静态网站时的 DNS

    抱歉 如果我的问题看起来很混乱 我对 DNS 或托管只有一个基本的了解 故事是这样的 我创建了几个个人网页并注册了一个域名 然后我发现我的几个页面不需要 大 托管 最好在云中托管一个网站 我选择了 GCP 进行托管 发现this教程并遵循以
  • 拖动后标记位于地图中心

    我在我的网站上实现了谷歌地图 用户可以拖动标记并获取坐标 它工作正常 但要求是当用户拖动标记时 拖动标记后应该出现在地图窗口的中心 或者如果用户拖动地图 那么在这种情况下标记也出现在地图窗口的中心 我有以下代码 仅适用于地图上的拖动标记 但
  • 让 Flexbox 中的图像填充所有垂直空间并保持完全可见

    我需要在 div 左侧放置一个图像 并放置该图像 与 div 高度相同 其本身具有非固定的 与内容相关的高度 完全可见 保持其纵横比 Flexbox 似乎非常适合这项工作 但当将图像设置为 100 高度时 其尺寸保留自然宽度 内容会溢出到
  • centos 8,firewalld 错误`COMMAND_FAILED:'python-nftables'失败`[关闭]

    Closed 这个问题是与编程或软件开发无关 目前不接受答案 当我尝试重新加载firewalld时 它告诉我 Error COMMAND FAILED python nftables failed internal 0 0 0 Error
  • appendChild 仅在第一次有效

    我想通过同一页面上的按钮和事件处理程序将相同的内容重复附加到元素 我遇到的问题是它只能在第一次使用 它第一次完全按照我想要的方式执行 然后在后续按下按钮时无法执行任何操作 我查了一下 似乎在第一个追加之后 newstuff innerHTM
  • 将 3D 模型安装在窗口内

    我想显示适合视图的不同尺寸的模型 以便整个模型在屏幕内可见 最好的方法是什么 我尝试使用此公式缩放 使用 glScale 模型 scaleFactor screenSize maxModelSize constant 其中尺寸是高度或宽度
  • 隐藏 Woocommerce 中特定用户角色的特定运输方式

    在 Woocommerce 中 我使用的是 WooCommerce Wholesale Pro Suite 来自IgniteWoo 以及统一费率盒子运输插件 将 B2B 添加到我们的网上商店 我正在尝试禁用特定用户角色 客人和客户的统一费率
  • Rails map.resources 与 has_many :through 不起作用?

    我有三个 相关的 模型 指定如下 class User lt ActiveRecord Base has many posts has many comments has many comments received through gt
  • .NET Maui - 重置 TabBar 项目单击上的导航

    我目前正在使用 NET Maui 想知道选项卡内的导航是如何工作的 我在文档中找不到我要找的内容 但如果我错过了 也许有人可以为我指出 所以目前我有一个带有两个底部选项卡的选项卡栏 第二个选项卡显示项目列表 当我单击一个项目时 我想显示一个
  • 使用 jq 将 JSON 转换为 CSV

    我有一个 json 文件 它存储在环境变量 temp 中 users username jack email email protected total running apps 1 api mock app 0 flogo 1 ipaas
  • Java 约定:在类中使用 getter/setter?

    我的教授非常强调通过始终使用访问器和修改器来访问私有实例变量来防止隐私泄露 但是 我是否必须在类中使用类的 getter setter 方法 举例来说 如果我有以下课程 public class Person private String
  • 使用 Anaconda 在 Google App Engine 上安装软件包?

    这个周末我制作了一个 Flask 应用程序 它使用了很多 ML 包 比如 Pytorch 模型都已经构建好了 所以我们不需要像 Google Compute Engine 这样疯狂的东西 但是 我仍然需要安装这些库 然而 其中许多 例如 P
  • 使用executeOnExecuter可以并行执行多少个?

    在我的应用程序中 当用户点击列表中的文档时 我需要提供文档的下载功能 因此 对于多个活动线程 AsyncTask 进入了我的脑海 但我也注意到人们并没有推荐 AsyncTask 来进行这种操作 因为在这种情况下大号没有 线程将在点击文档时开
  • @EnableMongoAuditing for MongoDB on Cloud Foundry / mongolab

    我的设置在本地有效 但在将其部署到 CloudFoundry mongolab 时无效 配置非常类似于docs 我本地的 spring 配置 Configuration Profile dev EnableMongoAuditing Ena
  • 这段 JavaScript 代码 getElementById 有什么问题吗?

    我下面有这个代码 div This is an example div 为什么它不起作用 该脚本在具有给定 id 的元素存在之前运行 并且您有一个DOM 属性名称其中有一个连字符 被视为减号运算符 div This is an exampl
  • 在express中全局重定向所有尾随斜杠

    我正在使用 Node js 和 Express 并且有以下路由 app get function req res locals date new Date toLocaleDateString res render home ejs loc
  • 一次不能多次借用“x”作为可变的

    在下面的代码中 操场 struct Node datum static str edges Vec
  • 从日期时间熊猫中提取季节

    我正在尝试从带有日期时间列的大型数据框中提取季节 这是我使用过的代码 def season of date date UTC year str date UTC year seasons spring pd date range start
  • ConcurrentModificationException 仅在 Java 1.8.0_45 中

    我对这段代码有两个问题 import java util public class TestClass private static List