在併發程序,這是安全的:getter上的volatile和setter上的同步與synchronized上的同步?
private volatile int i;
public int getI() {
return i;
}
public synchronized incrementI() {
i++;
}
?
根據我所瞭解的synchronize
,只有在獲取同一對象上的鎖定監視器的線程上,才能保證在i
上可用的更改。 所以我認爲,上面的代碼是不安全的。請確認是否屬實,否則請說明。 謝謝。
不幸的是,這個答案不正確。 「同步方法內部的更改都不會傳遞到所有線程」,也不會「如果您使其變爲易失性,所有線程都不會將其緩存」。這是一個正確的答案:http://stackoverflow.com/a/29446437/2613885 – 2015-04-04 12:32:46
@AlekseyShipilev如果你不使變量易變,那麼單獨的線程緩存其堆棧中的值。還更新同步塊中的變量,並更新其存儲它的所有線程中的值。你同意嗎?你所說的最終會導致這種情況。那麼如何來回答是錯誤的。 – Lokesh 2015-04-04 13:17:44
看到這篇文章:http://www.javamex.com/tutorials/synchronization_volatile.shtml – Lokesh 2015-04-04 13:18:59