Tag: memory model

JIT可以在某些表达式中将两个易失性读取合并为一个吗?

假设我们有一个volatile int a 。 一个线程呢 while (true) { a = 1; a = 0; } 而另一个线程呢 while (true) { System.out.println(a+a); } 现在,JIT编译器发出对应于2*a而不是a+a汇编是不合法 a+a吗? 一方面,易失性读取的目的是它应该始终从内存中消失。 另一方面,两个读取之间没有同步点,所以我看不出primefaces地处理a+a是违法的,在这种情况下我看不出像2*a这样的优化会如何破坏规范。 参考JLS将不胜感激。