完全可变的可见性保证

Li *_*lei 7 java multithreading volatile

我正在阅读有关Java Volatile关键字的文章,遇到了一些问题。点击这里

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

udpate()方法写入三个变量,其中只有几天是可变的。

完全易失的可见性保证意味着,当将值写入天时,线程可见的所有变量也将写入主存储器。这意味着,当将值写入天时,年和月的值也将写入主存储器。

那么,“线程可见的所有变量”是什么意思?这是否意味着线程堆栈中的所有变量?“线程可见”是什么意思?我如何知道该线程可以看到几个月和几年?

孙兴斌*_*孙兴斌 5

都是happens-before关系

这种关系只是保证一个特定语句写入的内存对另一个特定语句可见。

  1. 在同一个线程中,

        this.years  = years;
        this.months = months;
    
    Run Code Online (Sandbox Code Playgroud)

    happens-before

        this.days   = days;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在不同的线程中,写入volatile变量 happens-before的读者线程读取volatile 变量。

并且,happens-before关系具有传递性。当读取线程看到 volatile 变量的新鲜值时days,它也可以读取yearsand的新鲜值months

  • 请注意,这(如果它是正确的)仍然是一个非常弱的保证。它说您会看到一些更新,但它绝对不是说您在阅读/使用数据时总是会看到一致的年/月/日三元组。最突出的是,当读取天、月、年时(将易失性读取为第一个语句?),有人可能会调用“update()”,同时您和您“可能”会在一个或多个中看到该调用的结果更多你的领域。为了完全一致性,您需要使用适当的同步/锁定。 (4认同)