完全挥发性可见性保证
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.
在同一个线程中,
this.years = years;
this.months = months;
happens-before
:
this.days = days;
- 不同线程中,volatile变量的写入
happens-before
读取 volatile 的 reader 线程
变量。
并且,happens-before
关系有transitivity。当reader线程看到volatile变量days
的新值时,它也可以读取years
和months
.
的新值
只有保证这段代码可以给你,就是如果某个线程observes写入的值days
,它还会观察写入 years
和 months
的值——如果没有再次调用 update
;这些是不是原子的。
我正在阅读一篇关于 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.
在同一个线程中,
this.years = years; this.months = months;
happens-before
:this.days = days;
- 不同线程中,volatile变量的写入
happens-before
读取 volatile 的 reader 线程 变量。
并且,happens-before
关系有transitivity。当reader线程看到volatile变量days
的新值时,它也可以读取years
和months
.
只有保证这段代码可以给你,就是如果某个线程observes写入的值days
,它还会观察写入 years
和 months
的值——如果没有再次调用 update
;这些是不是原子的。