java - 完全 volatile 可见性保证

标签 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()方法写入了三个变量,其中只有days是volatile的。

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

那么,“线程可见的所有变量”是什么意思呢? 是指线程栈中的所有变量吗? “对线程可见”是什么意思?我怎么知道月份和年份对线程可见?

最佳答案

都是关于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 变量。

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

关于java - 完全 volatile 可见性保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57569133/

相关文章:

iOS AFNetworking 阻塞主线程

c++ - 不稳定和双重困惑

c# - 'volatile' 关键字在 C# 中是否仍然损坏?

java - 我们可以不在 Trie 构造函数中初始化引用数组吗

java - 如何使用Java中的特定字符串从字符串中删除字符串?

java - Java 中的 Jackson JSON 序列化 - 将 k/v 对写入根而不是嵌套在属性名称中

c++ - 基准测试、代码重新排序、 volatile

java - 为什么小程序大小是在 html 代码而不是 java 代码上定义的?

java - 同步列表时的操作顺序

c# - 启用具有并发性的 Queue<T>