可以通过JVM缓存对象的字段吗?

时间:2017-04-18 15:35:26

标签: java multithreading

private final Point p;
void synchronized setPoint(int x, int y) {
    p.x=x;
    p.y=y;
}
Point getPoint() {
    return p;
}

假设某些A类具有最终参考字段Point p。

  • Point p对象是在A类构造函数中创建的。

  • A类需要是线程安全的,因此有同步的setter setPoint可以改变p的内部字段。

由于引用p是最终的,我们不需要在多线程环境中阅读引用本身。但是对象的内部数据呢?

JVM可以将p的内部数据存储在任何正在运行的线程的缓存中吗?

通常,JVM是否将数据从堆(而不是堆栈)存储到缓存中?如果是这样,那么应该如何处理这些字段,因为volatile关键字只影响引用本身而不是引用对象?或者离开吸气器是否可以,它没有可见性问题?

JVM confusing schema on this topic

1 个答案:

答案 0 :(得分:1)

你的问题有点过于笼统 什么JVM?它们中有很多,也有很多不同的版本。

我熟悉HotSpot和OpenJDK JVM(我已经阅读了大部分代码),而且他们都不会费心去缓存"对象,因为大多数流行的CPU本身已经更有效地做到了。

如果您读取或写入来自不同线程的任何共享数据,请将该字段(或多个字段)与synchronized关键字同步。它将确保可见性和适当的内存排序。