我读过关于将对象标记为volatile并不能保证其成员的可见性的文章(
,引述:
JVM只会认为对象引用是不稳定的,而不会认为对象数据本身是驻留在堆上的
我的问题是:
-
“同步”将确保成员(在同一锁定对象上)在编辑后的可见性。是因为
这使得其他线程可以看到这些操作?
-
如果在对象上使用volatile,则对象引用将发生更改。如果旧引用缓存在单线程CPU缓存中,会发生什么情况?总司令会让它活着吗?
示例代码:
class Test{
volatile Data data;
}
Class Data{
int x;
int y;
}
data= new Data(); // happens-before relationship only on creation
//writer
Thread writerThread = new Thread(() -> {
data.setX(a);
data.setY(b);
});
//reader
Thread readerThread = new Thread(() -> {
// read here is not guaranteed visibility, x,y not volatile
int x = data.getX();
int y = data.getY();
});