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 中 的相关文章

  • 在eclipse java项目中加载dll文件

    我正在尝试添加文件sqljdbc auth dll到项目库 我将包含 dll 的文件夹添加为外部类文件夹 在这里 我基本上尝试使用 Microsoft 提供的 SQL 驱动程序连接到我的 SQL SERVER 2008 数据库 我的代码是
  • 项目展开时自动调整列大小

    在具有多列的树中 如何在展开 折叠和数据更新时调整列的大小以适应内容 类似的解决方案表格问题 https stackoverflow com questions 3186340 swt table auto resize all colum
  • 如何测试两个 Joda-Time DateTime 对象几乎相等?

    在单元测试中 我经常使用返回DateTime于或关于now 有没有办法说actual日期时间在几秒之内actual约会时间 这听起来是个坏主意 单元测试不应该以任何方式依赖于当前的实际时间 这就是为什么注入一些接口是一个很好的做法 称为Cl
  • 您最好的 Swing 设计模式和技巧是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • struts2应用程序未运行

    我是 Maven 和 struts2 的新手 当我尝试运行我的程序时出现以下错误 严重 调度程序初始化失败 无法加载配置 操作 文件 E workspace metadata plugins org eclipse wst server c
  • 如何防止 gson 将整数转换为双精度数

    我的 json 中有整数 但我不希望 gson 将它们转换为双精度数 以下不起作用 Test public void keepsIntsAsIs String json id 1 quantity 2 name apple id 3 qua
  • Java 中的双精度小数格式

    我在格式化双精度数的小数时遇到一些问题 如果我有双重值 例如4 0 如何格式化小数 使其变为 4 00 其中一种方法是使用数字格式 http docs oracle com javase tutorial i18n format decim
  • 在 IntelliJ IDEA 中编辑并继续?

    使用 IntelliJ IDEA 社区版进行调试时是否可以编辑一些代码 我在选项中找不到这个功能 是的 这就是所谓的 热插拔 您可以在调试过程中编译修改后的代码 并且类文件将被替换 直到您停止调试 确保在调试器设置中启用 HotSwap 选
  • 克隆在幕后是如何工作的?

    克隆不会调用对象构造函数来创建对象的副本 那么clone使用什么算法呢 我正在寻找本机方法克隆的实现细节 任何指示将不胜感激 请注意 我知道克隆的缺点 protected native Object clone 我不太清楚 我需要查看本机代
  • Unwrap 当使用 Collectors maxBy 和 groupingBy 时可选

    我有一堂课 有一个String and an int field public class Data private String name private int value private Data String name int va
  • 如何使用我的 Apple 开发者 ID 签署 .jar 文件

    我有一个java可执行文件jar我需要使用我的 Apple 开发者 ID 进行签名的文件 我不打算通过应用程序商店分发它 我将通过我的网站直接向客户分发该应用程序 我不打算绕过 Gatekeeper Signing the app和我的de
  • Hibernate 时间戳 - 毫秒精度

    似乎以毫秒精度存储时间戳是休眠的一个已知问题 我在数据库中的字段最初设置为时间戳 3 但我也尝试过日期时间 3 不幸的是 它没有任何区别 我尝试过使用 Timestamp 和 Date 类 最近我开始使用 joda time 库 经过所有这
  • 创建 FileInputStream 对象时使用 InputStream 而不是 FileInputStream 有什么区别

    这可能很愚蠢 但我想知道后台操作的区别 InputStream is new FileInputStream filepath FileInputStream is new FileInputStream filepath 上面两行代码有什
  • 如何在同一行实例化对象并调用setter?

    如果我有一个Employee具有默认构造函数的类 private String firstName public Employee 和一个二传手 public void setFirstName String firstName this
  • 从 java 反射中隐藏我的安全密钥

    下面的类是我用于加密的安全密钥提供程序 public class MySecretKey private String key 2sfdsdf7787fgrtdfg cj5 Some Util methods goes on Here 首先
  • Java 中使用 PBKDF2 进行密码验证

    我正在用 Java 进行基于密码的文件加密 我使用 AES 作为底层加密算法PBKDF2WithHmacSHA1使用以下代码从盐和密码组合中派生密钥 我从本网站上的另一位慷慨的海报获得 SecretKeyFactory f SecretKe
  • 从 blob 反序列化 java 对象

    首先 我很抱歉 我要问一些愚蠢的问题 我根本不懂java 也不知道我们是否可以问这样的问题 如果没有 删除我的主题 oracle中有一个存储blob的表 它是二进制的 我能够解码它 输出看起来像这样 sr com epam insure c
  • 将 JVM 参数放入要在运行时获取的文件中

    我正在构建当前应用程序的 jar 它需要设置几个 JVM 参数 有没有办法在文件中而不是在命令行上设置这些 JVM 参数 我已经做了一些搜索 看起来我可以使用 java properties 文件做一些事情 可能通过设置 java args
  • JShell 如何查找变量或结果的类型

    如何在 JShell 中查找变量或表达式结果的类型 正在尝试 Java 中的按位运算符 jshell gt byte b 5 lt lt 1 Error incompatible types possible lossy conversio
  • 将任何文件读取为二进制字符串

    正如标题所示 有什么方法可以读取 Java 或任何其他语言 中给定文件 txt docx exe 等 的二进制表示形式 在java中 我知道如何按原样读取文件的内容 即 String line BufferedReader br new B

随机推荐

  • 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