我無法在任何地方找到這個特定場景。同步訪問非易失性字段線程安全嗎?
如果我從兩個線程同時呼叫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