簡體   English   中英

何時在java中使用多線程中的volatile vs同步?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM