2014-01-07 65 views
-2

据我所知,干将也应该是同步的,但下面的代码给出爪哇 - 不同步的getter

Object get() { return val; } 

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

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

+0

你是什么意思_如何编译器搞砸了一个简单的return statement_? –

+0

对我来说很不清楚。 –

+0

你为什么认为getters应该始终保持同步? – Mureinik

回答

5

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

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

0

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

+1

如果是参考,它总是原子的。 – assylias