完全挥发性可见性保证

Full volatile Visibility Guarantee

我正在阅读一篇关于 Java Volatile 关键字的文章,有一些问题。 click here

public class MyClass {
    private int years;
    private int months
    private volatile int days;


    public void update(int years, int months, int days){
        this.years  = years;
        this.months = months;
        this.days   = days;
    }
}

udpate()方法写入了三个变量,其中只有days是volatile的。

完整的 volatile 可见性保证意味着,当一个值被写入 days 时,线程可见的所有变量也被写入主内存。这意味着,当一个值写入天时,年和月的值也会写入主存。

那么,"all variables visible to the thread" 是什么意思? 是指线程栈中的所有变量吗? "visible to the thread" 是什么意思?我怎么知道线程是否可见月份和年份?

一切都是为了 happens-before relationship

This relationship is simply a guarantee that memory writes by one specific statement are visible to another specific statement.

  1. 在同一个线程中,

        this.years  = years;
        this.months = months;
    

    happens-before:

        this.days   = days;
    
  2. 不同线程中,volatile变量的写入 happens-before 读取 volatile 的 reader 线程 变量。

并且,happens-before关系有transitivity。当reader线程看到volatile变量days的新值时,它也可以读取yearsmonths.

的新值

只有保证这段代码可以给你,就是如果某个线程observes写入的值days,它还会观察写入 yearsmonths 的值——如果没有再次调用 update;这些是不是原子的。