Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java内存模型-在跨越内存障碍时,到底是什么刷新到内存中?_Java_Multithreading_Java Memory Model - Fatal编程技术网

Java内存模型-在跨越内存障碍时,到底是什么刷新到内存中?

Java内存模型-在跨越内存障碍时,到底是什么刷新到内存中?,java,multithreading,java-memory-model,Java,Multithreading,Java Memory Model,我想我理解了单变量之前发生的关系。如果我写一个volatile字段,那么该字段的所有后续读取都将包含这个新值。写入一个volatile会跨越内存障碍,将新值刷新到主内存中 我仍然不清楚在所有其他情况下会发生什么-例如Thread.start(),synchronized或java.util.concurrent中的新锁。他们也跨越记忆障碍是什么意思?哪些数据从本地缓存刷新到主内存?换句话说,交叉的范围是什么 所有东西都是红色的吗?现在回到volatile,当一个内存障碍被跨越时,JVM会将所有本

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

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


所有东西都是红色的吗?现在回到
volatile
,当一个内存障碍被跨越时,JVM会将所有本地(在当前线程的上下文中)缓存的变量与主内存同步,而不仅仅刷新单个
volatile
字段吗?

。除此之外,它还会删除主内存中标记为脏的任何本地缓存数据

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


另外,您应该提到,它会删除中央内存中任何脏的缓存存储。对不起,吹毛求疵。这是一个好问题。@Gray您能详细说明(或提供链接)主内存中的脏缓存存储吗?“这是什么?”康拉德·尤金的回答恰到好处。我只是想让他提到,当一个记忆障碍被跨越时,同步会在两个方向上发生。或者,至少如果从主存到本地缓存的同步没有发生,至少主存中所有脏的本地缓存都会失效。AFAIK,它确保脏数据处于缓存一致状态。它不必一直到主内存。在x86/x64上,它还会停止cpu管道,这可能会影响性能。