簡體   English   中英

多線程方案中的易失性+同步組合

[英]volatile + synchronized combination in multithreaded scenario

我對synchronization內部知識volatile內部知識有基本的了解。

我有一個查詢,是對以下SE問題的跟蹤:

為什么在雙重檢查鎖定的示例中使用了volatile

我對一個部分感到困惑。 如果我嚴格按照上面的示例進行操作,則必須將volatile添加到許多變量中,但是我確信所有多線程應用程序都不會使用這種volatile +同步組合。

如果按照上面的示例, synchronization不能保證內存一致性,那么使用volatile變量與synchronization代碼的組合的用例是什么?

該問題/答案中的volatilesynchronized的組合僅適用雙重檢查鎖定

如果您不進行雙重檢查鎖定,並且始終在同一synchronized監視器的保護下訪問共享變量(如果應用程序未使用java.util.concurrent類,則這是應用程序最常訪問共享變量的方式),那么您就不需要volatile

無論如何,這並不意味着仔細檢查鎖定是個好主意。 盡管volatile + synchronized構造將使雙重檢查鎖定起作用,但它並沒有提供任何明顯的性能優勢,因為您還可以閱讀@alf對所指問題的回答。

當變量定義為volatile ,將從主存儲器而不是注冊表中讀取變量。

因此,每個處理器將看到相同的值。

在仔細檢查中,將變量定義為volatile ,以確保檢查synchronized塊外部將攔截大多數情況。

如果變量不是volatile則代碼將起作用,但是,如果您擁有更多的處理器,則可以在synchronized塊內進行更多操作(同樣,當變量不為null時)。

如果對變量的所有訪問都在synchronized塊中完成,則根本不需要volatile

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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