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关键字只影响引用本身而不引用对象?还是可以离开吸气剂并且没有可见性问题?
快速回答:在读取数据时也使用同步。只有同步集合才会导致线程错误。 –