完全可变的可见性保证

时间:2019-08-20 08:01:55

标签: java multithreading volatile

我正在阅读有关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()方法写入三个变量,其中只有几天是易变的。

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

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

2 个答案:

答案 0 :(得分:5)

关于happens-before relationship

  

此关系仅是保证内存写入一个   另一个特定的陈述对特定的陈述可见。

  1. 在同一线程中,

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

    happens-before

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

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

答案 1 :(得分:0)

保证此代码可以为您提供保证,即如果某个线程观察写入for row in fullrows: if "_csv" in row.text: print(mainurl + row.find('a').get('href')) # download this! 的值,它还将观察这些值写入daysyears-如果再次没有months调用;这些不是原子。