我知道getter也应该同步,但是下面给出了代码
Object get() { return val; }
synchronized void set(Object val) { ... }
编译器如何搞乱一个简单的return语句,这是一个原子的(从mem简单读取)?它与每处理器缓存有关吗?
答案 0 :(得分:5)
在这种情况下,将成员变量val
声明为volatile
就足够了。
问题是可见性之一。没有内存屏障,无法保证一个线程写入的更改将对另一个线程可见。如果没有障碍,JVM可以进行优化,例如将成员变量的值缓存在寄存器中,而不是将更改写入主内存,使其全局可见。
答案 1 :(得分:0)
返回语句甚至可能不是基于返回类型的原子。基本上,如果你返回超过4个字节,那么它不再是原子的。见this question