有人可以帮助我了解为什么下面的程序退出了吗?一个线程正在用i和1和2更新i。另一个线程正在读取i,如果i值既不是1也不是2,则将退出。实际上下面的程序不应该退出,而是退出打印1或2。static volatile int i = 1;public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { while (true) { i = (i == 1 ? 2 : 1); } } }).start(); new Thread(new Runnable() { @Override public void run() { while (true) { if (i != 1 && i != 2) { System.out.println("i=" + i); System.exit(0); } } } }).start();} 最佳答案 因为在if (i != 1 && i != 2)语句中有两个检查指令,它们是按顺序计算的,所以当调用i != 1时,i的值可能是2,所以它的计算结果是false,而被调用i != 2已由切换线程切换回值i,因此它也求值为1,因此整个false求值为false,因为在Java中对if (i != 1 && i != 2)的求值为不是原子的。