【发布时间】:2018-02-09 08:12:57
【问题描述】:
下面的代码给我的结果如下:
Change listener
Change listener
Change listener
Incrementing MY_INT to:1
Incrementing MY_INT to:2
Got Change for MY_INT :1loc:0
Change listener
Change listener
Change listener
Change listener
Change listener
Change listener
Change listener
Change listener
Change listener
Incrementing MY_INT to:3
Change listener
Incrementing MY_INT to:4
Incrementing MY_INT to:5
Got Change for MY_INT :3loc:2
Change listener
我的问题是,由于我使用了 volatile,MY_INT 值应该反映为 4 或 5。为什么它没有反映。有时,即使是这个值,我们也会得到 1。请有人让我知道我哪里出错了。
public class VolatileTest {
private static volatile int MY_INT = 0;
public static void main(String[] args) {
new ChangeListener().start();
new ChangeMaker().start();
}
static class ChangeListener extends Thread {
@Override
public void run() {
int local_value = MY_INT;
while ( local_value < 5){
if( local_value!= MY_INT){
System.out.println("Got Change for MY_INT :"+ MY_INT+"loc:"+local_value);
local_value= MY_INT;
}
System.out.println("Change listener");
}
}
}
static class ChangeMaker extends Thread{
@Override
public void run() {
int local_value = MY_INT;
while (MY_INT <5){
System.out.println("Incrementing MY_INT to:"+(local_value+1));
MY_INT = ++local_value;
}
}
}
}
【问题讨论】:
-
'volatile 关键字不同步值' - 是的,而且它不会以某种方式强制您的两个线程以任何保证的顺序发出输出。
标签: multithreading synchronized volatile