主函数开启了两个线程, 其中一个是负责增加一个 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 1
println 里面有个锁。没有锁,没有 volitale,线程之间变量的更改不可见。
|
3
amai0w0 2020-07-08 10:14:40 +08:00 via Android 1
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 1
|
10
br00k 2020-07-08 11:34:21 +08:00
换成 AtomicLong 不好吗?线程安全
|