易失性变量未读取其更新值

时间:2016-03-10 13:11:16

标签: java multithreading volatile

我有一个易变的变量示例:

    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,这是较旧的价值。 那么这里出了什么问题?

1 个答案:

答案 0 :(得分:1)

volatile对通过变量执行的指令进行排序,同步即将获得对变量(或代码)的独占访问权。

由于程序打印Got Change for MY_INT1 2直到执行local_value= MY_INT1;MY_INT1已被ChangeMaker更新3次。

如果您想要正确的输出,请同步MY_INT1ChangeListener的访问权限