[英]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.