在 Java 中,假设您有两个线程 T1 和 T2 同时在两个不同的处理器 P1 和 P2 上运行。
首先,线程 T2 使用obj
在(例如)起始内存位置 0x1000 分配的某个对象。这会导致 P2 在该内存位置内部缓存该值。T2 然后将(唯一的)对对象的引用清空,并对其进行垃圾收集。
线程 T1 然后执行
Foo fooRef = new Foo();
fooRef.x = 10;
恰好它fooRef.x
的位置也在 0x1000,因为 Foo 的这个实例被分配了重新使用上面 T2 释放的内存。
T1 然后将 fooRef 引用传递给线程 T2(通过队列或其他一些共享内存机制)。
T2 会看到以前的旧缓存值,还是会看到新值 10?
假设没有硬件缓存一致性机制。Java 本身是否确保在为对象释放或分配内存时清除每个处理器的缓存?(即使有硬件缓存一致性机制,一致性传播也不是瞬时的,如果 Java 本身没有采取其他一致性措施,T2 可能仍然会读取过时的值)。