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

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

  •  
  •   chanlk · 2020-07-08 10:09:12 +08:00 · 1778 次点击
    这是一个创建于 1598 天前的主题,其中的信息可能已经有所发展或是发生改变。

    主函数开启了两个线程, 其中一个是负责增加一个 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
        1
    snowydec  
       2020-07-08 10:14:36 +08:00
    volatile 关键字
    zhgg0
        2
    zhgg0  
       2020-07-08 10:14:39 +08:00   ❤️ 1
    println 里面有个锁。没有锁,没有 volitale,线程之间变量的更改不可见。
    amai0w0
        3
    amai0w0  
       2020-07-08 10:14:40 +08:00 via Android   ❤️ 1
    system.out 内部加锁,间接保证了内存可见性,不加打印的话应该把 value 设为 volatile 。
    anakinsky
        4
    anakinsky  
       2020-07-08 10:18:22 +08:00
    JMM 了解下
    fubei
        5
    fubei  
       2020-07-08 10:21:15 +08:00
    volatile
    chanlk
        6
    chanlk  
    OP
       2020-07-08 10:27:52 +08:00
    谢谢各位,我得去系统的学习下这方面的知识了
    ChanKc
        7
    ChanKc  
       2020-07-08 10:28:43 +08:00 via Android
    建议去看 Effective Java 和 Java lang spec
    Jacky23333
        8
    Jacky23333  
       2020-07-08 10:29:42 +08:00 via Android
    value 需要加个 volatile 修饰保证变量的可见性,楼主可以看看 java 内存模型相关的内容
    serical
        9
    serical  
       2020-07-08 11:13:39 +08:00   ❤️ 1
    br00k
        10
    br00k  
       2020-07-08 11:34:21 +08:00
    换成 AtomicLong 不好吗?线程安全
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5304 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:13 · PVG 16:13 · LAX 00:13 · JFK 03:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.