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