[英]When to use volatile vs synchronization in multithreading in java?
何時在多線程中使用volatile關鍵字vs同步?
使用volatile
可以保證對變量的每次讀訪問都會看到寫入該變量的最新值。 只要您需要為多個指令穩定值,請使用synchronized
。 (注意,這並不一定意味着多個語句;單個語句:
var++; // NOT thread safe!
即使var
聲明為volatile
也不是線程安全的。 你需要這樣做:
synchronized(LOCK_OBJECT){var++;}
請參閱此處以獲取此問題的精彩摘要。
Volatile僅確保讀取操作始終通過線程從內存中提供最新狀態。 但是,它不能確保任何寫操作的安全性/順序,即兩個線程可以以任何隨機順序更新volatile變量。 此外,它不能確保對變量的多個操作是原子的。
但是,同步塊可確保最新的狀態和寫入安全性。 對同步塊的訪問和更新也是原子的。 但是, 只有當所討論的變量的所有訪問/更新都使用相同的鎖對象時,上述情況才是真的,這樣多個線程就不會有權訪問變量。
這是一個非常廣泛的問題。 我能給出的最佳答案是在執行多個操作時使用synchronized
,其他線程必須看到這些操作是原子地發生的 - 要么全部執行,要么都沒有執行。
對於單一動作, volatile
可能就足夠了; 它充當內存屏障,以確保對其他線程的更改可見性。
Volatile不會獲得鎖定,它使用底層CPU架構來確保寫入后所有線程的可見性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.