通过浅复制避免 List 上的 ConcurrentModificationException

2024-05-03

我有一堂课如下:

class Test
{
    private LinkedList<Person> persons = new LinkedList<Person>;

    public synchronized void remove(Person person)
    {
        persons.remove(person);
    }

    public List<Person> getAllPersons()
    {
        // Clients may iterate over the copy returned and modify the structure.
        return new ArrayList<Person>(persons);
    }
}

persons可以同时修改:一个是viaremove()由一个线程和两个通过返回的浅复制实例getAllPersons().

我在多线程环境中测试了上述场景,看看是否可以避免ConcurrentModificationException通过返回一个浅拷贝getAllPersons()叫做。这似乎有效。我从来没有遇到过ConcurrentModificationException.

在这种情况下,为什么只制作一个浅拷贝persons避免一个ConcurrentModificationException?


当集合以导致打开迭代器无效的方式更改时,会引发 ConcurrentModificationException。当多个线程访问非线程安全的集合时,通常会发生这种情况(尽管这不是唯一的原因)

您的代码中仍然存在一个小错误 - 要安全地访问本身不是线程安全的成员,您应该synchronize在 getAllPersons 方法上。

假设这是固定的——因为您要返回一个副本,所以集合本身不能被其他调用者修改(每个调用者都会获得他们自己的副本)。这意味着您永远不会得到 ConcurrentModificationException。

请注意,这does not保护您免受线程安全问题的影响Person类,只有集合本身。如果Person是不可变的,你应该没问题。

在这种情况下,更好的解决方案是直接使用写入数组列表时复制 http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html它实现了类似的语义,但仅在您实际写入列表时复制 - 而不是每次读取时复制。

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

通过浅复制避免 List 上的 ConcurrentModificationException 的相关文章

随机推荐

  • 未提供 Bouncycastle 加密算法

    我正在尝试将 BouncyCastle 与 android 一起使用来实现 ECDH 和 EL Gamal 我添加了 bouncycastle jar 文件 bcprov jdk16 144 jar 并编写了一些适用于我的计算机 jvm 的
  • gluPerspective 与 gluOrtho2D

    我查看了 MSDN 上关于这两个函数的文档 但是 我不太明白这两个功能之间的区别 一个是用于设置 3D 相机视图 另一个是用于设置 2D 相机视图 如果能得到解答就太好了 预先感谢您的评论 正交投影基本上是没有透视的 3D 投影 本质上 这
  • Jenkins 管道中的导出命令

    如何在 Jenkins 管道中添加 导出 unix 命令 我里面有一个詹金斯 舞台 和 步骤 导出命令的语法是什么 我需要使用导出命令设置环境变量 PATH 您可以更新 PATH像这样 pipeline agent label docker
  • 使用perl求中位数、众数、标准差?

    我有一个数字数组 计算数据集的中位数 众数和标准差的最简单方法是什么 Statistics Basic Mean http p3rl org Statistics Basic Mean Statistics Basic Median htt
  • MySQL 索引创建速度很慢(在 EC2 上)

    我有一张相当简单的桌子 requestparams requestid varchar 64 NOT NULL requestString text ENGINE MyISAM 使用 LOAD DATA 填充表后 我正在更改架构并将 req
  • 如何安排函数在 Qt for Python 的主 UI 线程上运行?

    我正在移植一个 Python GTK 应用程序 因此它使用 Qt for Python PySide2 它使用Python标准实现工作线程threading模块和工作线程使用Gdk threads add idle 与主 GUI 线程交互
  • Jetty9 - Jetty 不是从单独的 {jetty.base} 运行

    在启动 jetty9 服务器作为服务时 我看到以下警告 我对此一无所知 警告 oejs HomeBaseWarning main Jetty 的此实例不是从单独的 jetty base 目录运行 不建议这样做 请参阅文档 http www
  • Case 表达式在 SQL 查询中无法正常工作

    我想连接列supplier使用逗号分隔符创建表并将其放入名为 contact 的别名字段中 我使用过检查空值的案例 假设如果contact number2则为空contact number3将在别名字段中 反之亦然 这是我的查询 SELEC
  • 如何将html设置为extjs中的元素

    1 如何设置HTML到已经创建的面板或任何其他元素 我是初学者 我尝试了下面的方法来设置 HTML 中的一些内容 var clickedElement Ext getCmp id el child gt clickedElement set
  • “排序文件名 | uniq”不适用于大文件

    我可以从小文本文件中删除重复条目 但不能从大文本文件中删除重复条目 我有一个 4MB 的文件 文件的开头如下所示 aa aah aahed aahed aahing aahing aahs aahs aal aalii aalii aali
  • 可扩展性和弹性有什么区别?

    我听说很多人交替使用这两个术语 但在我看来 它们之间还是有区别的 可扩展性 的能力软件系统在其当前硬件资源上处理更大的工作负载 scale up 或当前和额外的硬件资源 向外扩展 应用程序服务不中断 弹性 的能力硬件层下面 通常是云基础设施
  • 在命令行上编译 C++/CX

    我收到链接器错误fatal error C1107 could not find assembly platform winmd please specify the assembly search path using AI or by
  • 尝试构建我的 CUDA 程序时出现错误 MSB4062

    当我尝试构建我的第一个 GPU 程序时 出现以下错误 有什么建议可能会出什么问题吗 错误 1 错误 MSB4062 Nvda Build CudaTasks SanitizePaths 任务 无法从程序集 C Program 加载 文件 M
  • 如何处理 Ipython Notebook 中的引用?

    在 Ipython Notebook 中处理引用的最佳方法是什么 理想情况下 我想要一个 bibtex 文件 然后像在 Latex 中一样 在 Ipython markdown 单元格中拥有一个速记列表 并在笔记本末尾提供完整的参考文献 我
  • 截断浮点数而不向上舍入

    我有一个浮点数 我想将其截断为 3 位 但我不想向上舍入 例如 转换1 0155555555555555 to 1 015 not 1 016 我将如何在 Ruby 中做到这一点 您还可以转换为 BigDecimal 并对其调用 trunc
  • 为应用程序创建了新的 WidgetKit 扩展:SwiftUI 预览不适用于“appex 必须位于应用程序中”

    我使用的是 macOS 12 6 上的 Xcode 14 0 1 我正在尝试使用 WidgetKit 在现有应用程序中创建一个新的手表复杂功能 首先向我的项目添加一个 Widget 扩展模板目标 这会生成一个新文件夹 其中包含意图定义文件
  • UI 引导轮播第一张幻灯片不显示,然后在最后一张幻灯片崩溃

    我正在尝试实现 ui bootstraps 轮播 但是当页面加载时 第一个图像不会显示 但控件和指示器会显示 然后 当第二个图像显示时 我可以使用控件返回到第一个图像 它将显示正常 我可以使用控件到达最后一张幻灯片或让它自动滑动 但是当我到
  • 将 stdout 和 stderr 捕获到不同的变量中

    是否可以存储或捕获 stdout 和 stderr不同的变量 不使用临时文件 现在我这样做是为了获得标准输出out和标准错误err跑步时some command 但我会 喜欢避免临时文件 error file mktemp out some
  • Android 应用程序开发 - 不带 Intent 直接发送电子邮件

    任何人都可以建议我如何在不使用意图或打开另一个 Android 应用程序的情况下发送电子邮件 我希望点击发送按钮后直接发送电子邮件 我必须使用特定的 Office365 电子邮件来发送消息 我应该使用一些 API 或 SMTP 等吗 有没有
  • 通过浅复制避免 List 上的 ConcurrentModificationException

    我有一堂课如下 class Test private LinkedList