Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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 JVM是否保证缓存非易失性变量?_Java_Multithreading_Jvm_Java Memory Model_Non Volatile - Fatal编程技术网

Java JVM是否保证缓存非易失性变量?

Java JVM是否保证缓存非易失性变量?,java,multithreading,jvm,java-memory-model,non-volatile,Java,Multithreading,Jvm,Java Memory Model,Non Volatile,JVM是否保证缓存非易失性变量 程序员能否依赖JVM始终在本地为每个线程缓存非易失性变量 或者JVM可以这样做,也可以不这样做,因此编程人员不应该为此依赖JVM 提前感谢您的回答。否。JVM不保证缓存非易失性字段。JVM的实现保证了易失性字段的行为。字段的缓存是非标准的,未指定,可能因JVM实现而异。因此,即使您通过某种方式发现线程正在缓存某些数据,也不应该真正依赖它。JVM不保证缓存非易失性字段。JVM的实现保证了易失性字段的行为。字段的缓存是非标准的,未指定,可能因JVM实现而异。因此,即使

JVM是否保证缓存非易失性变量

程序员能否依赖JVM始终在本地为每个线程缓存非易失性变量

或者JVM可以这样做,也可以不这样做,因此编程人员不应该为此依赖JVM


提前感谢您的回答。

否。JVM不保证缓存非易失性字段。JVM的实现保证了易失性字段的行为。字段的缓存是非标准的,未指定,可能因JVM实现而异。因此,即使您通过某种方式发现线程正在缓存某些数据,也不应该真正依赖它。JVM不保证缓存非易失性字段。JVM的实现保证了易失性字段的行为。字段的缓存是非标准的,未指定,可能因JVM实现而异。因此,即使您通过某种方式发现某些数据正在被线程缓存,您也不应该真正依赖它。java语言规范非常清楚:

Java编程语言提供了第二种机制,volatile字段,在某些方面比锁定更方便

字段可以声明为volatile,在这种情况下,Java内存模型确保所有线程都能看到变量§17.4的一致值

就这样。你有一个特殊的关键字来定义这个特殊的语义。所以,当你换个角度思考时:如果没有这个特殊的关键字,你就不能依赖任何特殊的语义。然后,您将获得Java内存模型所提供的功能;但没别的了


要完全正确——当然,这允许您使用非常特殊的语义以不安全的方式篡改内存。

java语言规范非常清楚:

Java编程语言提供了第二种机制,volatile字段,在某些方面比锁定更方便

字段可以声明为volatile,在这种情况下,Java内存模型确保所有线程都能看到变量§17.4的一致值

就这样。你有一个特殊的关键字来定义这个特殊的语义。所以,当你换个角度思考时:如果没有这个特殊的关键字,你就不能依赖任何特殊的语义。然后,您将获得Java内存模型所提供的功能;但没别的了


为了完全正确——当然,这允许您以非常特殊的语义以不安全的方式篡改内存。

如果您需要字段快照,建议您将其复制到局部变量。这是在编写大量使用原子和读修改条件写循环的代码时发生的。

如果需要字段的快照,建议您将其复制到局部变量。这是在编写大量使用原子和读修改条件写循环的代码时发生的。

程序员无法依赖它。没有正确的代码你可以写,如果不同的话,操作会有所不同。另外:考虑给那些花时间回答你的问题的人一些反馈;要么接受其中一个答案,要么在这里或那里留下评论,以防您有进一步的问题。程序员无法依赖它。没有正确的代码你可以写,如果不同的话,操作会有所不同。另外:考虑给那些花时间回答你的问题的人一些反馈;要么接受其中一个答案,要么在这里或那里留下评论,以防你有进一步的问题。如果是原始答案-是。但作为参考,这是极端的字节码优化。在某些情况下,我们不确定这是一个易失性读取,它会有内存障碍。如果以并发方式访问,非易失性字段在您的鼻子下仍然可能会改变,也可能不会改变。将其复制到本地var将保证它不会。当然,如果一个非易失性变量同时被修改,OP可能已经做错了。是的,但我从来没有见过一种情况,在实践中你可能真的想要这样做。因为您在本地方法中指向的对象在您想要使用它时可能已经过时。您提供的示例就是这样做的:它检查在复制引用和实际使用之间,tail是否没有更改。如果它是原语-是。但作为参考,这是极端的字节码优化。在某些情况下,我们不确定这是一个易失性读取,它会有内存障碍。如果以并发方式访问,非易失性字段在您的鼻子下仍然可能会改变,也可能不会改变。将其复制到本地var将保证它不会。当然,如果一个非易失性变量同时被修改,OP可能已经做错了。是的,但我从来没有见过一种情况,在实践中你可能真的想要这样做。因为您在本地方法中指向的对象
在您想要使用它的时候,它可能已经过时了。您提供的示例就是这样做的:它检查在复制引用和实际使用之间,tail是否没有更改。True。我认为这与问题的背景无关;但为了得到一个完整的答案,我添加了这一部分。只是想知道:还有没有其他东西可以让答案更有价值呢?没错。我认为这与问题的背景无关;但为了得到一个完整的答案,我添加了这一部分。我只是想知道:还有什么遗漏的东西可以让答案更有价值吗?非常感谢宝贵的反馈和您的时间。它实际上可能取决于硬件,因此同一个JVM实现在不同平台上的行为可能会有所不同。大多数情况下,原因是CPU缓存。非常感谢宝贵的反馈和您的时间。它实际上可能取决于硬件,因此同一个JVM实现在不同平台上的行为可能会有所不同。大多数情况下,原因是CPU缓存。