我有一个易变的变量示例:
public class VolatileTest {
private static volatile int MY_INT1 = 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_INT1;
while ( local_value < 5){
if( local_value!= MY_INT1){
System.out.println("Got Change for MY_INT1 "+ MY_INT1);
local_value= MY_INT1;
}
}
}
}
static class ChangeMaker extends Thread{
@Override
public void run() {
int local_value = MY_INT1;
while (MY_INT1 <5){
System.out.println("Incrementing MY_INT1 to "+ (local_value+1));
MY_INT1 = ++local_value;
}
}
}
}
现在,当我运行它时,我得到如下输出:
Incrementing MY_INT1 to 1
Incrementing MY_INT1 to 2
Incrementing MY_INT1 to 3
Incrementing MY_INT1 to 4
Incrementing MY_INT1 to 5
Got Change for MY_INT1 2
这个输出是可变的,但我担心的是当更改侦听器正在打印值时(在这种情况下,它发生在最后一行),那么它应该是最新值5,在这种情况下它是2,这是较旧的价值。 那么这里出了什么问题?
答案 0 :(得分:1)
volatile
对通过变量执行的指令进行排序,同步即将获得对变量(或代码)的独占访问权。
由于程序打印Got Change for MY_INT1 2
直到执行local_value= MY_INT1;
,MY_INT1
已被ChangeMaker
更新3次。
如果您想要正确的输出,请同步MY_INT1
中ChangeListener
的访问权限