Volatile關鍵字失效

2021-09-25 21:41:54 字數 1099 閱讀 4037

volatile關鍵字用於修飾簡單型別變數,如int、float、boolean等資料型別,保證同一時刻只能有乙個執行緒修改變數。

volatile修飾變數的操作就會變成原子級別的,但這有一定的情況會失效:

public class volatiletest 

});thread t2 = new thread(() ->

});long starttime = system.currenttimemillis();

t1.start();

t2.start();

t1.join();

t2.join();

system.out.println(val);}}

這個例項期望的是得到600000,但是實際執行結果:

原因是:val +=1 並不是原子操作。 當volatile修飾簡單變數,當前值是根據以前的值得到時,例如:val+=1,val=val+1 , val++等,volatile關鍵字將失效。只有當變數的值和以前的值無關時,對該變數的操作才是原子級別,如val = n + 1。

這時候需要使用synchronized把操作(例如val+=1)抽取成乙個方法:

public class volatiletest2 

public static void main(string args) throws interruptedexception

});thread t2 = new thread(() ->

});long starttime = system.currenttimemillis();

t1.start();

t2.start();

t1.join();

t2.join();

system.out.println(val);}}

輸出結果:

volatile關鍵字失效。 求助!!!!!

public class test11 private void print public static void main string args catch interruptedexception e test.change start new thread new runnable catc...

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