在Java中,假设您有两个线程T1和T2在两个不同的处理器P1和P2上同时运行.
首先,线程T2与obj在(例如)起始存储器位置0x1000处分配的一些对象一起工作.这会导致P2在内部缓存该内存位置的值.T2然后将(仅)对该对象的引用置零,并且它是垃圾收集的.
线程T1然后
Foo fooRef = new Foo();
fooRef.x = 10;
Run Code Online (Sandbox Code Playgroud)
它只是发生了fooRef.x位置也是0x1000,因为这个Foo实例被分配重新使用由上面的T2释放的内存.
然后,T1将fooRef引用传递给线程T2(通过队列或其他一些共享内存机制).
T2会从之前看到旧的过时缓存值,还是会看到10的新值?
假设没有硬件缓存一致性机制.当Java为对象解除分配或分配内存时,它本身是否确保清除每个处理器的缓存?(即使存在硬件缓存一致性机制,一致性传播也不是即时的,如果没有采用Java本身的其他一致性度量,T2可能仍然会读取过时值).