【发布时间】:2017-03-07 06:20:24
【问题描述】:
在这个网站上的某个地方(我不记得这个问题)有人声称,对于不同的监视器和不同的易失性变量,发生之前发生的关系,即
// Thread T1
synchronized(O1)
{
}
// Thread T2
synchronized(O2)
{
}
如果线程 T1 在线程 T1 离开 synchronized(O1){} 块后进入 synchronized(O2){} 块,T2 将看到 T1 所做的所有更改。解释是当线程离开同步块(或写入 volatile 变量)时,它会将其缓存刷新到内存中。当一个线程进入同步块(或读取 volatile 变量)时,它会丢弃它的缓存并从内存中读取。是真的吗?
【问题讨论】:
-
不,不是。在某些硬件上可能会出现这种情况,但 Java 内存模型无法保证。一般来说,在处理多线程 Java 代码时,根据硬件实现细节(如内存和缓存刷新)进行推理并不是一个好主意。
-
从理论上讲,我认为这个问题是一个谬论。您不能说一个线程在没有 happens-before 关系的情况下“在”另一个线程“之后”执行某些操作,这不是为单独的监视器定义的。更实际地,特定 JVM 可能会在同步块结束时刷新其缓存这一事实并不意味着它是有保证的行为。
-
你可能在这里谈论我的回答:stackoverflow.com/a/21583879/179850
-
@Gray 谢谢,这确实是我在谈论的问题。我的错 - 你实际上说相反的事情发生之前 relashionship。
-
嗨弗拉基米尔,看看:stackoverflow.com/questions/32845755/…
标签: java multithreading happens-before