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

2024-01-20

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

这种情况如下:

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

鉴于程序的逻辑,不存在对计数器的并发访问。然而,该计数器在多个线程之间共享。计数器必须是易失性的吗?

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


强烈建议学习有关 Java 内存模型的整个 JLS 章节 –强制的事实上,对于任何使用 Java 进行并发处理的人来说。具体来说,您的案例涵盖在JLS,17.4.4: http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.4

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

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

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

同步跨线程共享的对象,但不能同时访问 的相关文章

随机推荐