gpt4 book ai didi

java - 同步跨线程共享的对象,但不能同时访问

转载 作者:行者123 更新时间:2023-12-01 17:29:00 26 4
gpt4 key购买 nike

假设我有一个带有字段data的共享对象。多个线程将共享对此对象的引用以便访问该字段。不过,线程永远不会同时访问该对象。我需要将data声明为 volatile 吗?

这种情况如下:

  • Counter 类定义一个唯一字段value 和一个方法increment
  • 一个线程递增计数器,然后生成另一个递增计数器的线程,等等。

考虑到程序的逻辑,不存在对计数器的并发访问。然而,该计数器在多个线程之间共享。计数器必须是 volatile 的吗?

这种情况的另一种变体是,多个线程操作一个纯数据对象 X,但通过另一个依赖并发控制的对象 Y 交替执行它们的时间执行(以便 X 永远不会同时访问)(wait通知同步)。对象 X 的字段应该是 volatile 的吗?

最佳答案

强烈建议学习有关 Java 内存模型的整个 JLS 章节 - 事实上,对于任何使用 Java 进行并发处理的人来说,这是强制性的。具体来说,您的案例包含在JLS, 17.4.4:中。

“启动线程的操作与其启动的线程中的第一个操作同步。”

这意味着对于您的第一个场景,您不需要 volatile 。然而,无论如何,最好让它对 future 的代码更改具有鲁棒性。您确实应该有充分的理由使用 volatile ,只有在读取率极高(至少每秒数百万次)的情况下才有效。

关于java - 同步跨线程共享的对象,但不能同时访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12838776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com