2017-04-18 44 views
1
private final Point p; 
void synchronized setPoint(int x, int y) { 
    p.x=x; 
    p.y=y; 
} 
Point getPoint() { 
    return p; 
} 

让我们假设一些A类有最后的参考字段点p。JVM可以缓存对象的字段吗?

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

  • 类A需要是线程安全的,所以有一个同步的setter setPoint来改变p的内部字段。

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

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

一般来说,JVM是否将数据从堆(而不是堆栈)存储到缓存?如果是这样,那么应该如何处理这样的字段,因为volatile关键字只影响引用本身而不引用对象?还是可以离开吸气剂并且没有可见性问题?

JVM confusing schema on this topic

+4

快速回答:在读取数据时也使用同步。只有同步集合才会导致线程错误。 –

回答

1

您的问题有点过于笼统。
什么是JVM?其中有很多,也有很多不同的版本。我很熟悉HotSpot和OpenJDK JVM(我已经读过他们代码的大部分内容),并且它们都不会打扰“缓存”对象,因为大多数流行的CPU本身已经更高效地执行它了。

如果您从不同线程读取或写入任何共享数据,请将该字段(或字段)与​​关键字同步。它将确保可视性和正确的内存排序。

相关问题