private final Point p;
void synchronized setPoint(int x, int y) {
p.x=x;
p.y=y;
}
Point getPoint() {
return p;
}假设A类有最后的参考场点p。
因为引用p是最终的,所以我们不需要费心在多线程环境中读取引用本身。但是对象的内部数据呢?
JVM可以将p的内部数据存储在缓存中以供任何正在运行的线程使用吗?
一般来说,JVM是否将数据从堆(而不是从堆栈)存储到缓存?如果是这样的话,应该如何处理这些字段,因为挥发性关键字只影响引用本身,而不影响引用对象?或者,离开getter并没有可见性问题还可以吗?

发布于 2017-04-18 15:45:42
你的问题有点笼统。
什么JVM?他们有很多,也有很多不同的版本。
我熟悉HotSpot和OpenJDK JVM(我已经读过他们的大部分代码),他们中没有人会费心去“缓存”对象,因为大多数流行的CPU本身已经更高效了。
如果您从不同线程读取或写入任何共享数据,请将该字段(或字段)与synchronized关键字同步。它将确保可见性和适当的内存排序。
https://stackoverflow.com/questions/43476475
复制相似问题