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

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

  •  
  •   ahjiangwu · 2019-06-24 16:25:54 +08:00 · 2472 次点击
    这是一个创建于 1970 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
    NullErro
        1
    NullErro  
       2019-06-24 17:40:21 +08:00
    你 start 之后暂停一段时间再看看是不是你这个结论呢,start()之后并不一定就立即启动 T1 这个线程了
    momocraft
        2
    momocraft  
       2019-06-24 17:44:42 +08:00
    保证可见的反面是 “不保证可见” ,不是 “保证不可见”
    superalsrk
        3
    superalsrk  
       2019-06-24 17:53:51 +08:00
    2L 说的对
    sagaxu
        4
    sagaxu  
       2019-06-24 17:54:47 +08:00 via Android   ❤️ 2
    因为 System.out.println 里面有同步机制,基于 happens-before 的可传递性原则,你的代码执行之间也同步了
    zjp
        5
    zjp  
       2019-06-25 00:47:56 +08:00 via Android
    4L 说的对
    https://www.v2ex.com/t/539969
    写出正确的并发测试不容易,可能还需要注意 JIT
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2012 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:19 · PVG 00:19 · LAX 08:19 · JFK 11:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.