volatile關鍵字用於修飾簡單型別變數,如int、float、boolean等資料型別,保證同一時刻只能有乙個執行緒修改變數。
volatile修飾變數的操作就會變成原子級別的,但這有一定的情況會失效:
這個例項期望的是得到600000,但是實際執行結果:public class volatiletest
});thread t2 = new thread(() ->
});long starttime = system.currenttimemillis();
t1.start();
t2.start();
t1.join();
t2.join();
system.out.println(val);}}
原因是: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的位址中找出...