我无法在任何地方找到这个特定场景。同步访问非易失性字段线程安全吗?
如果我从两个线程同时呼叫init()
,其中一个呼叫是否保证看到time
不再为空? time
是否也需要volatile
?
它是否像join()
这是一个同步点?
private Long time;
synchronized void init() {
if (time != null) {
throw new IllegalStateException("Already initialised.");
}
this.time = System.currentTimeMillis();
}
我认为如果变量是非易失性的,那么在多个处理单元上可能会出现缓存问题。 – 2014-10-06 05:35:16
如果这不是线程安全的,'synchronized'将完全无用。 – Mat 2014-10-06 05:36:40
*同步*关键字隐式暗示a *发生在*关系之前。所以,是的,它是线程安全的。 – TheLostMind 2014-10-06 05:37:31