java - 即使两个线程不同时读写,我是否也需要同步?

标签 java multithreading synchronization volatile atomic

在 Java 程序中,假设一个变量正在由一个线程(例如 T1)写入,并且同一变量正在由另一个线程(例如 T2)读取,但不同时进行。因此,当我知道 T2 仅在 T1 写入后才会读取(如何完成是另一回事)时,我是否还需要将该变量声明为 volatile/同步它/使用 AtomicReference?

我猜 T2 在少数情况下最终读取过时值的可能性很小?

最佳答案

这取决于您如何确保 T2 仅在 T1 写入后才读取。如果写入和读取之间存在正确的happens-before关系,则操作是安全的。 p>

引用chapter 17.4 of the Java 7 specification (或较新文档中的相应部分)了解详细信息。 Happens-before 是传递性的并且

If an action x synchronizes-with a following action y, then we also have hb(x, y).

也就是说,如果您有一个独立的同步原语,确保读取之后和写入之前发生发生之前的关系,那么您的读取就是安全的。

关于java - 即使两个线程不同时读写,我是否也需要同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43666359/

相关文章:

javascript - 如何在循环中处理异步 Node.js

java - 关于OOP中的引用和值

java - 在 RecyclerView 中访问同一行中的所有元素

java - 我在@OneToMany hibernate 映射中遇到错误?

C 线程 Http 服务器错误

java - 为什么我的代码不是线程安全的?

java - Thread.run 在探查器日志中占用大量 CPU 时间

java - Java 的分类终端对象

elasticsearch - Elasticsearch读取模型与写入模型同步

C文件同步