volatile修飾符 記憶體可見性 禁止重排

2021-10-04 23:14:34 字數 1103 閱讀 4781

volatile是乙個能保證變數的記憶體可見性,且禁止重排的修飾符;

volatile通過設立4個記憶體屏障避免處理器的重排序;

volatile可以作為乙個鎖使用(用於多執行緒同步);

volatile能保證變數的記憶體可見性。翻譯成大白話:

被volatile修飾過的變數v,具有以下特點:

只要嘗試讀取v,則該執行緒的本地記憶體立即與主記憶體同步;

只要嘗試寫入v,則該執行緒的本地記憶體的改變,立即同步到主記憶體;

v不會和普通變數重排;(在對v操作上面的**,一定已經被執行過了);

通過記憶體屏障實現。

記憶體屏障介紹:下述load代表讀操作,store代表寫操作

**loadload屏障:**對於這樣的語句load1; loadload; load2,在load2及後續讀取操作要讀取的資料被訪問前,保證load1要讀取的資料被讀取完畢。

**storestore屏障:**對於這樣的語句store1; storestore; store2,在store2及後續寫入操作執行前,保證store1的寫入操作對其它處理器可見。

**loadstore屏障:**對於這樣的語句load1; loadstore; store2,在store2及後續寫入操作被刷出前,保證load1要讀取的資料被讀取完畢。

**storeload屏障:**對於這樣的語句store1; storeload; load2,在load2及後續所有讀取操作執行前,保證store1的寫入對所有處理器可見。它的開銷是四種屏障中最大的(沖刷寫緩衝器,清空無效化佇列)。在大多數處理器的實現中,這個屏障是個萬能屏障,兼具其它三種記憶體屏障的功能

volatile給處理器設立的記憶體屏障:

在每個volatile寫操作前插入乙個storestore屏障;

在每個volatile寫操作後插入乙個storeload屏障;

在每個volatile讀操作後插入乙個loadload屏障+乙個loadstore屏障;

《深入淺出多執行緒》

關於volatile修飾符

volatile是乙個型別修飾符 type specifier 它是被設計用來修飾被不同執行緒訪問和修改的變數。如果沒有volatile,基本上會導致這樣的結果 要麼無法編寫多執行緒程式,要麼使編譯器失去大量優化的機會。乙個定義為volatile的變數是說 這變數可能會被意想不到地改變 這種意外不是...

kotlin 可見性修飾符

人要每天給自己找點事幹,無所事事會毀掉乙個人,對於類 方法,介面,構造器,方法,屬性和他們的setter方法都可以有可見性的修飾符,在kotlin中有四種修飾符,private,protected,internal,public,如果沒有說明預設的是public public 修飾符指的是屬性或者是...

volatile型別修飾符的作用

volatile關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如 作業系統 硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的 就不再進行優化,從而可以提供對特殊位址的穩定訪問。使用該關鍵字的例子如下 int volatile nvint 當要求使...