在網路上找了好多關於volatile的文章,一直沒有找到體現volatile作用的程式碼範例,本文通過代碼給大家介紹一下volatile的作用。如有不正之處,歡迎批評指正。
樣本一:
public class TestWithVolatile { private volatile static boolean bChanged; public static void main(String[] args) throws InterruptedException { new Thread() { @Override public void run() { for (;;) { if (bChanged == !bChanged) { System.out.println("!="); System.exit(0); } } } }.start(); Thread.sleep(1); new Thread() { @Override public void run() { for (;;) { bChanged = !bChanged; } } }.start(); }}
這是網上找的一段樣本,被無數個猿類噴了,大家紛紛說加不加“volatile”結果都一樣,樓主沒驗證程式就把代碼貼出來了,我建了個工程run了這段代碼,確實如大家所說,加不加“volatile”都會輸出“。=”。於是乎自己接著上網找資料,找能夠說明volatile作用的代碼,無意中看到了“在多線程環境下,volatile能夠保證線程擷取到最新的資料”多線程這幾個字在我心中一閃,於是我開始改造上面的範例程式碼
樣本二:
public class TestWithVolatile { private static volatile boolean bChanged; public static void main(String[] args) throws InterruptedException { for(int i = 0; i < 10; i++){ new Thread() { @Override public void run() { for (;;) { if (bChanged == !bChanged) { System.out.println("!="); System.exit(0); } } } }.start(); } Thread.sleep(1); new Thread() { @Override public void run() { for (;;) { bChanged = !bChanged; } } }.start(); }}
我啟動了10個做判定條件的線程,run了代碼,這時候volatile的作用體現出來了,不加volatile的代碼一直出於運行狀態,加了volatile的代碼馬上就exit了。感覺到volatile的作用了,接著我又調整了一下代碼。
樣本三:
public class TestWithVolatile { private static volatile boolean bChanged; public static void main(String[] args) throws InterruptedException { new Thread() { @Override public void run() { for (;;) { bChanged = !bChanged; } } }.start(); Thread.sleep(1); for(int i = 0; i < 10; i++){ new Thread() { @Override public void run() { for (;;) { if (bChanged == !bChanged) { System.out.println("!="); System.exit(0); } } } }.start(); } }}
我把10個判定條件的線程移到代碼的後面,run代碼,發現加不加“volatile”都可以快速的exit程式。
為什麼會是這樣的。以下是我的推測
樣本二中:先建立10線程同時擷取bChanged的值,這是volatile起到了作用能夠使個線程擷取最新的值。
樣本三中:先設定bChanged值,後擷取bChanged的值,for迴圈建立線程,建立第一個線程,就相當於樣本一的代碼了,有可能在沒有建立完全部線程的時候,第一個建立的線程已經exit程式了。所以加不加volatile執行結果都一樣。分享給大家。