Java'final'实例变量-并发访问可以读取不同的值吗?

问题描述 投票:0回答:2

[阅读与线程和锁相关的documentation时,描述final关键字的句子吸引了我:

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

的意思是,如果我将final Object object = ...声明为实例变量,然后从匿名内部类(Runnable的多个实例)访问它(修改其内部状态),则实际上可以读取object /从/写入CPU缓存,并且其状态可能在这些Runnable实例之间不同步?

如果是,是使用volatile Object object的解决方案吗?

谢谢。

[在阅读与线程和锁相关的文档时,描述final关键字的一句话吸引了我:相应地,允许编译器将final字段的值保留在...中]] >>

声明final Object object=...时,最终值是对对象的引用,而不是对象的内部状态。这意味着没有什么可以修改object,不是说什么也不能修改,例如object.value。因此,可以缓存变量object,这并不意味着可以缓存object的内部状态。

最终将无法以您希望的方式帮助您解决线程问题,对不起。易失性在某些情况下可能会有所帮助,但您可能需要锁定。

java concurrency volatile final
2个回答
0
投票

声明final Object object=...时,最终值是对对象的引用,而不是对象的内部状态。这意味着没有什么可以修改object,不是说什么也不能修改,例如object.value。因此,可以缓存变量object,这并不意味着可以缓存object的内部状态。


0
投票

最终将无法以您希望的方式帮助您解决线程问题,对不起。易失性在某些情况下可能会有所帮助,但您可能需要锁定。

© www.soinside.com 2019 - 2024. All rights reserved.