chanlk
V2EX  ›  Java

Javaer 帮忙看下一个多线程的小问题

  •  
  •   chanlk · Jul 8, 2020 · 2948 views
    This topic created in 2309 days ago, the information mentioned may be changed or developed.

    主函数开启了两个线程, 其中一个是负责增加一个 Value 类中的静态变量, 另一个是负责检查这个静态变量的值,当这个值达到一定值后就开始打印;

    为什么下面这段程序的 CheckThread 不能输出?那个 value 的值在几秒钟时间就超过 500000000 了

    另外奇怪的是 CheckThread 在 while(true)的后面增加一个打印,就能进 if 里面了,详情见代码;

    下面是代码:

    class Scratch {
        public static void main(String[] args) {
            new IncreasingThread().start();
            new CheckThread().start();
        }
    }
    
    class Value {
        static long value = 0;
    }
    
    class IncreasingThread extends Thread {
        @Override
        public void run() {
            while (true) {
                Value.value++;
            }
        }
    }
    
    class CheckThread extends Thread {
        @Override
        public void run() {
            while (true) {
               // 打开下面的这行注释,就能进去 if 里执行打印了
               // System.out.println(Value.value);
                if (Value.value > 500000000) {
                    System.out.println("value over 500000000");
                }
            }
        }
    }
    
    snowydec
    snowydec
    Jul 8, 2020
    1
    volatile 关键字
    zhgg0
    zhgg0
    Jul 8, 2020❤️1
    2
    println 里面有个锁。没有锁,没有 volitale,线程之间变量的更改不可见。
    amai0w0
    amai0w0
    Jul 8, 2020 via Android❤️1
    3
    system.out 内部加锁,间接保证了内存可见性,不加打印的话应该把 value 设为 volatile 。
    anakinsky
    anakinsky
    Jul 8, 2020
    4
    JMM 了解下
    fubei
    fubei
    Jul 8, 2020
    5
    volatile
    chanlk
    chanlk
    OP
    Jul 8, 2020
    6
    谢谢各位,我得去系统的学习下这方面的知识了
    ChanKc
    ChanKc
    Jul 8, 2020 via Android
    7
    建议去看 Effective Java 和 Java lang spec
    Jacky23333
    Jacky23333
    Jul 8, 2020 via Android
    8
    value 需要加个 volatile 修饰保证变量的可见性,楼主可以看看 java 内存模型相关的内容
    serical
    serical
    Jul 8, 2020❤️1
    9
    br00k
    br00k
    Jul 8, 2020
    10
    换成 AtomicLong 不好吗?线程安全
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3026 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 11:35 · PVG 19:35 · LAX 03:35 · JFK 06:35
    ♥ Do have faith in what you're doing.