我读过有关将对象标记为volatile的方法,不能保证其成员的可见性(我不是在说线程安全性只是内存可见性,引用:
JVM仅将对象引用视为易失性,而不是将驻留在堆上的对象数据本身
我的问题:
示例代码:
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();
});
答案 0 :(得分:0)
happens-before
关系将确保这一点。尽管volatile关键字还在写线程和读线程之间建立了happens-before
关系。使用易失性变量可降低内存一致性的风险 错误,因为任何对volatile变量的写入都会建立一个 发生于事前的关系,以及随后的相同阅读 变量。