volatile關鍵字 學習記錄2

2022-03-10 06:11:08 字數 1154 閱讀 3084

1

public

class volatiletest2 implements

runnable

11system.out.println(vt.resource);12}

1314

@override

15public

void

run() 19}

20 }

這個例子中雖然resource前面有volatile關鍵字,但是執行結果有時候仍然不是200000000..為什麼呢? 我想分享下我的觀點.

首先每個執行緒有自己的記憶體,他們修改resource的時候會先把資料拷貝到自己的記憶體中,再修改,再寫回主記憶體..所以如果是這樣的話那麼多個執行緒同時操作可能會有很多種情況,下面舉2種情況

(不加volatile關鍵字的時候會出現的n種情況中的2種)

第一種情況:

第二種情況

上面2種情況都會使t2執行緒把resource寫回主記憶體的時候把t1自增那次操作覆蓋掉.因為t1與t2執行緒讀主記憶體的resource的值是一樣的...所以相當於t1的自增是無效的.

當resource前面加了volatile關鍵字的時候:

用volatile修飾的變數,執行緒在每次使用變數的時候,都會讀取變數修改後的最新的值。

所以加了這個關鍵字以後是可以避免第二種情況的.

t1 resource自增以後會直接寫回主記憶體,使t2讀取操作讀取到的是最新的值.相當於resource++與寫回主記憶體是同乙個事務,不可以分隔.

但是仍然不能避免第一種情況的發生.

在第一種情況下,執行緒t2 讀取resource是發生在t1 resource自增之前的,所以當t1 自增以後並不會影響t2執行緒記憶體中的resource,因為這並不違背volatile.如果此時t2再去讀取resource那才是最新的值.不過可惜他在t1自增之前就讀取了,所以t2中resource的值仍然是舊的.當t2寫回主記憶體的時候仍然會覆蓋t1自增的值.

以上就是我的理解.

volatile關鍵字 學習記錄1

雖然已經工作了半年了.雖然一直是在做web開發.但是平時一直很少使用多執行緒.用例子來說明問題吧 1 public class volatiletest 14 15 1617 class a implements runnable 2324 public void run 2829 30 31cla...

關鍵字 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的位址中找出...