Java内存模型-在跨越内存障碍时,到底是什么刷新到内存中?
我想我理解了单变量之前发生的关系。如果我写一个volatile字段,那么该字段的所有后续读取都将包含这个新值。写入一个Java内存模型-在跨越内存障碍时,到底是什么刷新到内存中?,java,multithreading,java-memory-model,Java,Multithreading,Java Memory Model,我想我理解了单变量之前发生的关系。如果我写一个volatile字段,那么该字段的所有后续读取都将包含这个新值。写入一个volatile会跨越内存障碍,将新值刷新到主内存中 我仍然不清楚在所有其他情况下会发生什么-例如Thread.start(),synchronized或java.util.concurrent中的新锁。他们也跨越记忆障碍是什么意思?哪些数据从本地缓存刷新到主内存?换句话说,交叉的范围是什么 所有东西都是红色的吗?现在回到volatile,当一个内存障碍被跨越时,JVM会将所有本
volatile
会跨越内存障碍,将新值刷新到主内存中
我仍然不清楚在所有其他情况下会发生什么-例如Thread.start()
,synchronized
或java.util.concurrent
中的新锁。他们也跨越记忆障碍是什么意思?哪些数据从本地缓存刷新到主内存?换句话说,交叉的范围是什么
所有东西都是红色的吗?现在回到
volatile
,当一个内存障碍被跨越时,JVM会将所有本地(在当前线程的上下文中)缓存的变量与主内存同步,而不仅仅刷新单个volatile
字段吗?。除此之外,它还会删除主内存中标记为脏的任何本地缓存数据
关于volatile-是的,它还将本地缓存的所有内容与主内存同步,而不仅仅是单个volatile字段(从1.5开始)
另外,您应该提到,它会删除中央内存中任何脏的缓存存储。对不起,吹毛求疵。这是一个好问题。@Gray您能详细说明(或提供链接)主内存中的脏缓存存储吗?“这是什么?”康拉德·尤金的回答恰到好处。我只是想让他提到,当一个记忆障碍被跨越时,同步会在两个方向上发生。或者,至少如果从主存到本地缓存的同步没有发生,至少主存中所有脏的本地缓存都会失效。AFAIK,它确保脏数据处于缓存一致状态。它不必一直到主内存。在x86/x64上,它还会停止cpu管道,这可能会影响性能。