在Java程序中,假设一个线程(例如,T1)正在写入一个变量,而另一个线程(比如T2)正在读取同一个变量,但不能同时读取。所以,当我知道T2只有在写完T1后才能读取(如何完成另一个问题),我还需要将该变量声明为volatile / synchron it /使用AtomicReference吗?
我想T2会在少数情况下最终读取陈旧价值的可能性最小?
答案 0 :(得分:1)
这取决于如何确保只有在写入T1后才能读取T2。如果在写入和读取之间有恰当的先发生关系,则操作是安全的。
有关详细信息,请参阅chapter 17.4 of the Java 7 specification(或较新文档中的相应部分)。 Happens-before是传递性的
如果动作x与后续动作y同步,那么我们也有hb(x,y)。
也就是说,如果你有一个独立的同步原语,确保在读取之后和写入之前发生之前的关系,那么你的读取是安全的。