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

2020-07-08 10:09:12 +08:00
 chanlk

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/688124

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX