ArrayList并发访问

2023-12-05

我知道ArrayList不是线程安全的,但我不确定这的确切含义。

如果是ThreadA and ThreadB两者都使用ArrayList,哪些情况会导致问题并需要同步?

  1. 两个线程同时读取相同的索引
  2. ThreadA替换一个元素ThreadB正在尝试同时访问,假设您不关心是否ThreadB获取旧元素或新元素。

两个线程同时读取相同的索引

多个线程从公共线程读取数据是可以的ArrayList if该列表是由分叉的线程构造的ThreadA and ThreadB并且该列表在线程分叉之前已完全构建并加载。

这样做的原因是线程和分叉它的线程的内存有一个发生之前的保证。例如,如果ThreadC建立ArrayList but after ThreadA and ThreadB是分叉的,那么不能保证 A 和 B 能够完全看到ArrayList——如果有的话。

如果不是这种情况,那么您将需要同步列表。见下文。

ThreadA 更改 ThreadB 尝试同时访问的元素,假设您不关心 ThreadB 是否获取旧元素或新元素。

一旦您在并发设置中谈论对列表的修改,那么您必须在该列表上进行同步,否则无法保证修改将被发布,并且列表可能会部分发布,这可能会导致数据异常。正如@Marko 所说,其内部状态可能不一致。

您可以使用CopyOnWriteArrayList它是为很少的更新和很多的读取而设计的,使用Collections.synchronizedList(...)为了使您的列表受到保护,您可以始终以某种方式访问​​该列表synchronized块(对于所有写入and读取),或者您可以切换到使用并发集合,例如ConcurrentSkipList或者其他的东西。

ThreadA 更改 ThreadB 尝试同时访问的元素

这有点模棱两可。例如,如果您正在谈论将对象存储在列表中,然后更改恰好存储在列表中的对象,那么您不会遇到同步问题list但你会遇到同步问题object。如果列表的数据没有改变那就没问题了。但是,如果您需要保护该对象,则可以使用以下列表AtomicReference<YourObject>, volatile对象中的字段或其他同步需要确保更改在线程之间发布。

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

ArrayList并发访问 的相关文章

随机推荐

  • 多处理模块

    在本课程中 您将了解为什么要采用这种方法 因为你的代码写在函数式编程风格 你可以相当容易地并行化它 有一个平行的map构建您可以使用的 这样 您就可以并行运行处理步骤 您将导入multiprocessing模块 因为它具有并行运行此操作所需
  • JSF:从 Jar 中提供资源

    我正在创建几个装有 Facelets 模板的罐子 供整个组织使用 在 JSF 1 2 中 此功能并不是开箱即用的 堆 Jboss EAP 5 1 Seam 2 2 富脸3 3 3 在我看来 我主要需要两个资源 查找 Faclets 资源的资
  • 在特定的开始、结束日期和时间限制内运行 Quartz Scheduler 作业

    我正在使用 Quartz Scheduler 来执行重复性任务 但我遇到了麻烦 在我的服务器端 我的用户想要指定一些日期范围 例如From 2013 09 27 with in 09 00 AM 12 00 PM to 2013 09 30
  • Pinterest 的官方 OAuth2 流程似乎返回无效的访问令牌

    我按照 Pinterest 的说明进行操作验证用户身份完成步骤 2 后 我手里拿着一个访问令牌 但是 当我使用此访问令牌进行 API 调用时 我收到以下响应 status failure code 3 host coreapp devpla
  • 有没有办法让 JQuery ajax 成功函数访问它所包含的对象?

    我有这样的 JavaScript function Cat this meow function meow ajax do AJAX call success this meow var TopCat new Cat 这不起作用 因为 th
  • 如何在正则表达式子例程中访问捕获组?

    我有一个模式想在几个地方使用 但我想访问该模式的内部部分 有没有办法做到这一点 In this 简化的例子 DEFINE lt isa gt s
  • 全局内存写入在 CUDA 中是否被视为原子?

    全局内存写入在 CUDA 中是否被视为原子操作 考虑以下 CUDA 内核代码 int idx blockIdx x blockDim x threadIdx x int gidx idx 1000 globalStorage gidx so
  • 通过参考返回

    PHP 文档中写道 不要使用按引用返回来提高性能 引擎 会自动对其进行优化 我希望返回对数组的引用 这是我的类的属性 PHP 如何优化这个 因为数组不是对象 如果数组有10亿个条目 如果我不通过引用传递它 我不会得到两个在内存中存储有10亿
  • MySQL SUM 函数在多个连接中

    嗨 这是我的情况 我有那些桌子 Customer id name Charges id amount customer id Taxes id amount charge id 所以我想计算费用和税费的总和 然后按客户 ID 分组 这是我的
  • EL 空运算符在 JSF 中如何工作?

    在 JSF 中 可以使用 EL 空运算符来呈现或不呈现组件 rendered not empty myBean myList 据我了解 该运算符既可以用作空检查 也可以检查列表是否为空 我想对我自己的自定义类的某些对象进行空检查 我需要实现
  • 访问共享内存进行读取时锁定

    如果我以只读方式访问共享内存 请检查某个条件if 块 我还应该锁定互斥锁吗 例如 mutex lock if var shared memory mutex unlock 这里是否需要锁定并且是良好的做法 如果您正在读取的变量可以同时写入
  • 如何使用 Matlab 按字母顺序对属性值对进行排序

    我想向现有文件添加属性值对 同时 所有属性应按字母顺序排序 例如 Info property 1 value 1 system property 2 value 2 我如何添加其他属性 以便所有属性都按字母顺序排序 我能够使用以下命令将属性
  • 使用 HTML5 音频更改 在 Chrome 中有效,但在 Safari 中无效

    我正在尝试制作一个可在每个主要浏览器中使用的 HTML5 音频播放列表 Chrome Safari Firefox IE9 但是 我不知道如何以跨浏览器兼容的方式更改源 UPDATED例如 更改
  • 迭代器无法正确访问问题

    我正在尝试使用迭代器访问向量的元素 但我得到奇怪的输出 std vector
  • Excel VBA 循环遍历可见的筛选行

    我有一个带有自动过滤器的 Excel 表格 在过滤表中 我只过滤了几行 我的目标是迭代所有可见行以收集数据以复制到另一张工作表 我想要一种方法来收集具有第一个可见行号的变量 我的草稿代码是 Dim cnp As String Dim nom
  • 我们是否应该在 React 功能组件的每个函数处理程序中使用 useCallback

    假设我们有这样的组件 const Example gt const counter setCounter useState 0 const increment gt setCounter counter gt counter 1 retur
  • 使用具有 PhoneStateListener 功能的 BroadcastReceiver

    我正在尝试制作一个 MissCall 应用程序 当收到未接来电时 该应用程序会自动发送消息 我已经完成了我的应用程序并且运行良好 这是完整的场景 问题 该应用程序运行良好但是当我重新启动设备时 应用程序无法运行 它仅在我启动我的应用程序至少
  • 是否可以将占位符文本从头到尾转换?

    我想在已知宽度的文本输入中从头到尾转换单行动态占位符文本 隐藏溢出 现在我知道对于常规容器 div 我可以利用转换来转换正确的长度 因此 对于长度为 100px 的容器 我可以使用以下命令过渡到文本末尾 transform translat
  • Swift 2 - 将数组分成带有从 A 到 Z 的键的字典

    例如 我有一个数组 Apple Banana Blueberry Eggplant 我想将其转换为字典 如下所示 A Apple B Banana Blueberry C D E Eggplant 我在 Xcode 7 beta 4 上使用
  • ArrayList并发访问

    我知道ArrayList不是线程安全的 但我不确定这的确切含义 如果是ThreadA and ThreadB两者都使用ArrayList 哪些情况会导致问题并需要同步 两个线程同时读取相同的索引 ThreadA替换一个元素ThreadB正在