JVM GC 能否在引用比较的中间移动对象,从而导致比较失败,即使双方都引用同一对象?
2022-08-31 16:38:43
众所周知,GC有时会在内存中移动对象。我的理解是,只要在移动对象时(在调用任何用户代码之前)更新所有引用,这应该是完全安全的。
但是,我看到有人提到引用比较可能是不安全的,因为GC在引用比较过程中移动了对象,因此即使两个引用都应该引用同一对象,比较也可能失败?
即,是否存在以下代码不会打印“true”的情况?
Foo foo = new Foo();
Foo bar = foo;
if(foo == bar) {
System.out.println("true");
}
我试着用谷歌搜索这个,缺乏可靠的结果使我相信说这一点的人是错误的,但我确实发现了各种各样的论坛帖子(比如这个),似乎表明他是正确的。但这个话题也有人说不应该是这样。