首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >垃圾收集和同步可见性

垃圾收集和同步可见性
EN

Stack Overflow用户
提问于 2018-12-15 11:10:15
回答 1查看 535关注 0票数 3

我读过关于将对象标记为易失性并不能保证其成员的可见性(,我不是说线程安全,而是内存可见性),引用如下:

只有对象引用才会被JVM认为是不稳定的,而不是驻留在堆中的对象数据本身。

我的问题:

  1. 如果成员已被编辑,同步将确保成员的可见性(在同一个锁对象上)。这是因为发生在锁的末尾(释放)之前,使其他线程可以看到这些操作吗?
  2. 如果在对象上使用易失性,且对象引用发生更改。如果旧引用被缓存在一个线程CPU缓存中,会发生什么?GC会让它活下来吗?

样本代码:

代码语言:javascript
复制
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();          
  });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-15 11:17:08

  1. 是的,happens-before的关系将成为这方面的专家。而易失性关键字也在写线程和读线程之间建立happens-before关系。

使用易失性变量降低了内存一致性错误的风险,因为对易失性变量的任何写入都会在与该变量随后读取的关系之前发生。

  1. java语言规范没有提到它,也没有提到任何关于如何实现易失性的特定机制。因此,我想这取决于特定的JVM。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53791805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档