15

我想我理解单个变量的发生之前的关系。如果我写了一个 volatile 字段,该字段的所有后续读取都将包含这个新值。写入 avolatile会跨越内存屏障并将新值刷新到主内存。

我仍然不清楚在所有其他情况下会发生什么 - 例如Thread.start()synchronized或者新锁java.util.concurrent。他们也跨越了记忆障碍是什么意思?哪些数据从本地缓存刷新到主存?换句话说,穿越的范围是什么?

是不是所有的东西都被冲洗掉了?现在回到volatile,它刷新的不仅仅是单个volatile字段吗?

4

1 回答 1

12

当跨越内存屏障时,JVM 会将所有本地(在当前线程的上下文中)缓存的变量与主内存同步。除此之外,它还会删除在主内存中标记为脏的任何本地缓存数据。

关于 volatile - 是的,它还将本地缓存的所有内容与主内存同步,而不仅仅是单个 volatile 字段(自 1.5 起)

http://www.javamex.com/tutorials/synchronization_volatile_java_5.shtml

于 2012-04-02T20:56:10.767 回答