首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Java

研究 volatile 时遇到一个困惑的问题

  •  
  •   ahjiangwu · 112 天前 · 1015 次点击
    这是一个创建于 112 天前的主题,其中的信息可能已经有所发展或是发生改变。

    volatile 实现线程之间的可见性的示例如下:

    import java.util.concurrent.TimeUnit;
    
    public class volatileTest {
        public static void main(String[] args) {
    
            Data data = new Data();
    
            new Thread(() -> {
                try {
                    TimeUnit.SECONDS.sleep(1);
                    data.addPlusPlus();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }, "T1").start();
    
            while (data.number == 0) {
                //System.out.println(data.number);  注意这一行注释了
            }
            System.out.println("number > 0");
    
            while (Thread.activeCount() > 2) {
                Thread.yield();
            }
        }
    }
    
    class Data {
        //volatile int number = 0;
        int number = 0;
    
        public void addPlusPlus() {
            this.number ++;
        }
    }
    
    

    当把

    int number = 0; 
    

    改为

    volatile int number = 0;
    

    时确实实现了主线程打印结果

    然而

    number 没有加 volatile 之前,while 循环中有注释的那一行时,主线程依然可以打印结果

    这是为什么???

    5 回复  |  直到 2019-06-25 00:47:56 +08:00
        1
    NullErro   112 天前
    你 start 之后暂停一段时间再看看是不是你这个结论呢,start()之后并不一定就立即启动 T1 这个线程了
        2
    momocraft   112 天前
    保证可见的反面是 “不保证可见” ,不是 “保证不可见”
        3
    superalsrk   112 天前
    2L 说的对
        4
    sagaxu   112 天前 via Android   ♥ 2
    因为 System.out.println 里面有同步机制,基于 happens-before 的可传递性原则,你的代码执行之间也同步了
        5
    zjp   112 天前 via Android
    4L 说的对
    https://www.v2ex.com/t/539969
    写出正确的并发测试不容易,可能还需要注意 JIT
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4287 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 03:41 · PVG 11:41 · LAX 20:41 · JFK 23:41
    ♥ Do have faith in what you're doing.