ahjiangwu
V2EX  ›  Java

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

  •  
  •   ahjiangwu · Jun 24, 2019 · 2898 views
    This topic created in 2521 days ago, the information mentioned may be changed or developed.

    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 replies    2019-06-25 00:47:56 +08:00
    NullErro
        1
    NullErro  
       Jun 24, 2019
    你 start 之后暂停一段时间再看看是不是你这个结论呢,start()之后并不一定就立即启动 T1 这个线程了
    momocraft
        2
    momocraft  
       Jun 24, 2019
    保证可见的反面是 “不保证可见” ,不是 “保证不可见”
    superalsrk
        3
    superalsrk  
       Jun 24, 2019
    2L 说的对
    sagaxu
        4
    sagaxu  
       Jun 24, 2019 via Android   ❤️ 2
    因为 System.out.println 里面有同步机制,基于 happens-before 的可传递性原则,你的代码执行之间也同步了
    zjp
        5
    zjp  
       Jun 25, 2019 via Android
    4L 说的对
    https://www.v2ex.com/t/539969
    写出正确的并发测试不容易,可能还需要注意 JIT
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5696 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 03:22 · PVG 11:22 · LAX 20:22 · JFK 23:22
    ♥ Do have faith in what you're doing.