[英]volatile + synchronized combination in multithreaded scenario
我對synchronization
內部知識volatile
內部知識有基本的了解。
我有一個查詢,是對以下SE問題的跟蹤:
我對一個部分感到困惑。 如果我嚴格按照上面的示例進行操作,則必須將volatile
添加到許多變量中,但是我確信所有多線程應用程序都不會使用這種volatile +同步組合。
如果按照上面的示例, synchronization
不能保證內存一致性,那么使用volatile
變量與synchronization
代碼的組合的用例是什么?
該問題/答案中的volatile
和synchronized
的組合僅適用於雙重檢查鎖定 。
如果您不進行雙重檢查鎖定,並且始終在同一synchronized
監視器的保護下訪問共享變量(如果應用程序未使用java.util.concurrent
類,則這是應用程序最常訪問共享變量的方式),那么您就不需要volatile
。
無論如何,這並不意味着仔細檢查鎖定是個好主意。 盡管volatile
+ synchronized
構造將使雙重檢查鎖定起作用,但它並沒有提供任何明顯的性能優勢,因為您還可以閱讀@alf對所指問題的回答。
當變量定義為volatile
,將從主存儲器而不是注冊表中讀取變量。
因此,每個處理器將看到相同的值。
在仔細檢查中,將變量定義為volatile
,以確保檢查synchronized
塊外部將攔截大多數情況。
如果變量不是volatile
則代碼將起作用,但是,如果您擁有更多的處理器,則可以在synchronized
塊內進行更多操作(同樣,當變量不為null時)。
如果對變量的所有訪問都在synchronized
塊中完成,則根本不需要volatile
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.