Java - 非同步的getter

Bob*_*r02 -2 java concurrency

我知道getter也应该同步,但是下面给出了代码

Object get() { return val; }

synchronized void set(Object val) { ... }
Run Code Online (Sandbox Code Playgroud)

编译器如何搞乱一个简单的return语句,这是一个原子的(从mem简单读取)?它与每处理器缓存有关吗?

eri*_*son 5

在这种情况下,声明成员变量valvolatile就足够了.

问题在于可见性.没有内存屏障,无法保证一个线程写入的更改将对另一个线程可见.如果没有障碍,JVM可以进行优化,例如在寄存器中缓存成员变量的值,而不是将更改写入全局可见的主内存.