首頁常見問題正文

volatile類型變量提供什么保證?

更新時(shí)間:2024-03-12 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  volatile是一個(gè)關(guān)鍵字,用于聲明一個(gè)變量可能會(huì)在程序的外部被修改,因此編譯器不應(yīng)該對這個(gè)變量的訪問進(jìn)行優(yōu)化。volatile的主要作用是告訴編譯器不要對該變量進(jìn)行優(yōu)化,以確保在多線程或者多任務(wù)環(huán)境下,變量的讀取和寫入是可見的,并且不會(huì)被編譯器的優(yōu)化所影響。

  volatile關(guān)鍵字提供以下保證:

  1.禁止編譯器對變量進(jìn)行優(yōu)化,確保每次訪問都會(huì)從內(nèi)存中讀取或?qū)懭搿?/p>

  2.保證多線程環(huán)境下對變量的讀寫操作是可見的,即一個(gè)線程對變量的修改能夠立即被其他線程看到。

  下面是一個(gè)簡單的示例,演示了volatile變量的使用:

public class VolatileExample {
    private volatile boolean flag = false;

    public void toggleFlag() {
        flag = !flag;
    }

    public void printFlag() {
        System.out.println("Flag value: " + flag);
    }

    public static void main(String[] args) {
        VolatileExample example = new VolatileExample();

        // Thread to continuously toggle the flag
        Thread toggleThread = new Thread(() -> {
            while (true) {
                example.toggleFlag();
                try {
                    Thread.sleep(1000); // Sleep for 1 second
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        // Thread to continuously print the flag value
        Thread printThread = new Thread(() -> {
            while (true) {
                example.printFlag();
                try {
                    Thread.sleep(2000); // Sleep for 2 seconds
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        toggleThread.start();
        printThread.start();
    }
}

  在這個(gè)示例中,flag變量被聲明為volatile,這樣可以確保在printThread線程中讀取flag變量時(shí),能夠立即看到toggleThread線程對flag變量的修改。這樣就能保證printFlag()方法中打印的flag值是及時(shí)更新的。

分享到:
在線咨詢 我要報(bào)名
和我們在線交談!