繁体   English   中英

Java 'final' 实例变量 - 变量内部 state 的可见性和传播

[英]Java 'final' instance variable - visibility and propagation of variable's internal state

在阅读 Threads and Locks 相关的文档时,一个描述final关键字的句子吸引了我:

相应地,允许编译器将最终字段的值缓存在寄存器中,并且在必须重新加载非最终字段的情况下,不从 memory 重新加载它。

Does it mean, that if I declare a final Object object =... as an instance variable and then access it (modify its inner state - object.state ) from anonymous inner classes (multiple instances of Runnable ), then the value of object.state实际上可以从 CPU 缓存读取/写入/写入 CPU 缓存,并且它( object.state的值)可能在这些可Runnable实例之间不同步?

So if I want to be sure, that the value of object.state is properly propagated across all the threads I have to declare the object as volatile Object object instead?

谢谢你。


编辑:我已经编辑了我原来的问题。 And now I know I misunderstood the documentation so the answer to my last question is NO - volatile/final Object object has no effect on object.state - it depends how the object.state is declared, initialized and/or accessed.

感谢@Burak Serdar 的回答!

当你声明一个final Object object=...时,最终值是对 object 的引用,而不是 state4966666.DCFDE892311 的内部 state4B6666. 这意味着没有什么可以修改object ,它并不是说没有什么可以修改,例如object.value 所以变量object可以缓存,不代表object内部的object可以缓存。

Final 不会以您希望的方式帮助您解决线程问题,抱歉。 Volatile 在某些情况下可能会有所帮助,但您可能需要锁定。

来自 Oracle 教程:

- 对于引用变量和大多数原始变量(除了 long 和 double 之外的所有类型),读取和写入都是原子的。 - 对于声明为 volatile 的所有变量(包括 long 和 double 变量),读取和写入都是原子的。

这意味着您的 object 在读写之间不会立即更新,但会在一次读/写内保持一致。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM