Java - 非同步的getter

时间:2014-01-07 19:31:14

标签: java concurrency

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

Object get() { return val; }

synchronized void set(Object val) { ... }

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

2 个答案:

答案 0 :(得分:5)

在这种情况下,将成员变量val声明为volatile就足够了。

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

答案 1 :(得分:0)

返回语句甚至可能不是基于返回类型的原子。基本上,如果你返回超过4个字节,那么它不再是原子的。见this question