volatile關鍵字是如何保證程式的可見性

2021-09-26 23:36:45 字數 1133 閱讀 9447

volatile被喻為輕量級的"synchronized",雖然一定程度上要比synchronized關鍵字效率要高,但它也有不足之處,就是不具有互斥性和原子性。

volatile關鍵字的主要作用就是保證各執行緒之間的可見性,意思就是在多執行緒環境下,某個共享變數如果被其中乙個執行緒給修改了,其他執行緒能夠立即知道這個共享變數已經被修改了,當其他執行緒要讀取這個變數的時候,最終會去記憶體中讀取,而不是從自己的工作空間中讀取,我們來看一段**。

public class testvolatile implements runnable  catch (interruptedexception e) 

flag=true;

system.out.println("flag=" + isflag());

}public boolean isflag()

public void setflag(boolean flag)

static class thread2}}

}}

這段**正常的話應該輸出主線程中的資料「***************====」,然而執行之後並沒有

原因就是main執行緒首先執行此時主存中的flag為false,run執行緒執行時把flag變成true在還沒有提交到主線程時main執行緒又搶占到flag,此時的flag依舊為false,由於while(true)的執行效率特別高,高到方法體內的flag一直搶占不到true的時候,所以列印時就無法輸出「**********==」。如圖:

啥時候我們加乙個synchronized也可以解決,但前面我們也提到了 synchronized太重量,所以此時我們可以在變數之前加乙個volatile關鍵字使各執行緒之間的資料具有可見性,可理解為 run方法將flag變成true之後,主存中的flag立即變成true以便main執行緒能夠及時看到。

private volatile boolean flag = false;

如何理解volatile關鍵字

暫時由於查了好多網路上的資料都沒有具體的說明,有範圍也很大沒有看懂,後面如果理解有錯再修改。1.全域性共享變數非volatile 我是這樣理解的,對於多執行緒中,多個執行緒啟動時,部分先啟動的執行緒會把全域性變數拷貝乙個副本到自己的執行緒棧,有的則是啟動 還沒有read load變數到自己的本地棧空...

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