代码之家  ›  专栏  ›  技术社区  ›  Mohammad Karmi

垃圾收集和同步可见性

  •  0
  • Mohammad Karmi  · 技术社区  · 6 年前

    我读过关于将对象标记为volatile并不能保证其成员的可见性的文章( ,引述:

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

    我的问题是:

    1. “同步”将确保成员(在同一锁定对象上)在编辑后的可见性。是因为 这使得其他线程可以看到这些操作?
    2. 如果在对象上使用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();          
      });
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   xingbin    6 年前
    1. happens-before volatile 以前发生过

    使用易失性变量可以降低内存一致性的风险 错误,因为对易失性变量的任何写入都会建立 变量

    1. java语言规范没有提到它,也没有提到关于如何实现volatile的任何特定机制。所以我想这取决于特定的JVM。
    推荐文章