在Java并发环境下,为什么b == (b = a)不总是true?

在Java中,为什么b == (b = a)这段代码在多线程环境不总是返回true?

a可以被多个线程修改。
b初始化为b = a
在打印b == (b = a)时,结果却不一定为true。

可是,操作符的优先级不是先b = a再b == b吗?

代码如下:

public class Demo implements Runnable{

    public static double a = 0;

    @Override
    public void run() {
        a = Math.random()*100;
        double b = a;
        System.out.println(b == (b = a));
    }

     public static void main(String args[]) {

         for(int i=0;i<10;i++) {
             new Thread(new Demo()).start();
         }
     }
    
}

打印结果:

false
true
true
true
false
true
false
true
true
true
阅读 1.9k
1 个回答

b==b并不是直接比较两个b,而且会先把b放到寄存器中,然后比较两个寄存器中的值。在将第二个b放入寄存器的时候,b可能会被修改。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题