Volatile關鍵字 方便以後檢視

2021-10-10 13:24:15 字數 1797 閱讀 1142

volatiile 的作用

1,防止指令重排

2,保證變數的可見性但是不能保證其原子性

防止指令重排:

public

class

cat;

private

static cat getcat()

}}return cat;

}

/*為什麼我們要在變數前面加上volatile關鍵字?

可見性指乙個執行緒修改了共同變數,而另乙個執行緒不知道,查詢的是之前沒有修改的資料,這樣會造成第二個執行緒查詢的是髒資料,這是因為每個執行緒都有乙個高速的快取區–執行緒工作記憶體;vloatile關鍵字能夠有效的解決這個問題;

原子性:

關於原子性,volatile關鍵字只對單詞的讀寫保持原子性,

public

class

volatiletest01

public

static

void

main

(string[

] args)

throws interruptedexception

catch

(interruptedexception e)

volatiletest01.

change()

;}})

.start()

;}thread.

sleep

(1000);

//為了保證上面的**能夠全部執行完畢

這樣就可以看出volatile關鍵字不能夠保證原子性(如果能夠保證原子性的話結果應該是1000),因為a++是乙個復合操作:

1,讀取a的值;

2,2,將a+1;

3,3,將a的值再次寫回記憶體

volatile這個關鍵字不能保證這三個操作的原子性,我們可以通過加鎖(synchronized)的方式實現他的原子性。

可見性的原因:

因為執行緒不是本身不是直接跟記憶體進行資料交換的,而是通過執行緒自身的工作記憶體完成的,所以會導致沒有可見性;volatile是通過的將執行緒修改後的值強制的重新整理到主記憶體中,然後會使別的執行緒的執行緒工作記憶體失效,需要重新在主記憶體中獲取最新的值;

關鍵字 volatile關鍵字的作用

1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...

關鍵字volatile詳解

與關鍵字const一樣,關鍵字volatile也是乙個型別修飾符 type specifier 關於volatile的作用 例如程式清單 volatile int m 10 int k,n m k i volatile將告訴編譯器,整形變數m是隨時發生變化的,每次使用m的時候,都要求從m的位址中找出...

volatile關鍵字 詳解

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