主函数开启了两个线程, 其中一个是负责增加一个 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");
            }
        }
    }
}
|      1snowydec      2020-07-08 10:14:36 +08:00 volatile 关键字 | 
|      2zhgg0      2020-07-08 10:14:39 +08:00  1 println 里面有个锁。没有锁,没有 volitale,线程之间变量的更改不可见。 | 
|  |      3amai0w0      2020-07-08 10:14:40 +08:00 via Android  1 system.out 内部加锁,间接保证了内存可见性,不加打印的话应该把 value 设为 volatile 。 | 
|  |      4anakinsky      2020-07-08 10:18:22 +08:00 JMM 了解下 | 
|  |      5fubei      2020-07-08 10:21:15 +08:00 volatile | 
|      6chanlk OP 谢谢各位,我得去系统的学习下这方面的知识了 | 
|      7ChanKc      2020-07-08 10:28:43 +08:00 via Android 建议去看 Effective Java 和 Java lang spec | 
|  |      8Jacky23333      2020-07-08 10:29:42 +08:00 via Android value 需要加个 volatile 修饰保证变量的可见性,楼主可以看看 java 内存模型相关的内容 | 
|  |      9serical      2020-07-08 11:13:39 +08:00  1 | 
|  |      10br00k      2020-07-08 11:34:21 +08:00 换成 AtomicLong 不好吗?线程安全 |