声明final Object object=...
时,最终值是对对象的引用,而不是对象的内部状态。这意味着没有什么可以修改object
,不是说什么也不能修改,例如object.value
。因此,可以缓存变量object
,这并不意味着可以缓存object
的内部状态。
[阅读与线程和锁相关的documentation时,描述final
关键字的句子吸引了我:
相应地,在必须重新加载非最终字段的情况下,允许编译器将最终字段的值保留在寄存器中,并且不从内存中重新加载它。
的意思是,如果我将
final Object object = ...
声明为实例变量,然后从匿名内部类(Runnable
的多个实例)访问它(修改其内部状态),则实际上可以读取object
/从/写入CPU缓存,并且其状态可能在这些Runnable
实例之间不同步?
如果是,是使用volatile Object object
的解决方案吗?
谢谢。
[在阅读与线程和锁相关的文档时,描述final关键字的一句话吸引了我:相应地,允许编译器将final字段的值保留在...中]] >>
声明final Object object=...
时,最终值是对对象的引用,而不是对象的内部状态。这意味着没有什么可以修改object
,不是说什么也不能修改,例如object.value
。因此,可以缓存变量object
,这并不意味着可以缓存object
的内部状态。
最终将无法以您希望的方式帮助您解决线程问题,对不起。易失性在某些情况下可能会有所帮助,但您可能需要锁定。
声明final Object object=...
时,最终值是对对象的引用,而不是对象的内部状态。这意味着没有什么可以修改object
,不是说什么也不能修改,例如object.value
。因此,可以缓存变量object
,这并不意味着可以缓存object
的内部状态。
最终将无法以您希望的方式帮助您解决线程问题,对不起。易失性在某些情况下可能会有所帮助,但您可能需要锁定。