我读过关于将对象标记为易失性并不能保证其成员的可见性(,我不是说线程安全,而是内存可见性),引用如下:
只有对象引用才会被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();
});发布于 2018-12-15 11:17:08
happens-before的关系将成为这方面的专家。而易失性关键字也在写线程和读线程之间建立happens-before关系。使用易失性变量降低了内存一致性错误的风险,因为对易失性变量的任何写入都会在与该变量随后读取的关系之前发生。
https://stackoverflow.com/questions/53791805
复制相似问题