更新時(shí)間:2024-03-12 來(lái)源:黑馬程序員 瀏覽量:
volatile是一個(gè)關(guān)鍵字,用于聲明一個(gè)變量可能會(huì)在程序的外部被修改,因此編譯器不應(yīng)該對(duì)這個(gè)變量的訪(fǎng)問(wèn)進(jìn)行優(yōu)化。volatile的主要作用是告訴編譯器不要對(duì)該變量進(jìn)行優(yōu)化,以確保在多線(xiàn)程或者多任務(wù)環(huán)境下,變量的讀取和寫(xiě)入是可見(jiàn)的,并且不會(huì)被編譯器的優(yōu)化所影響。
volatile關(guān)鍵字提供以下保證:
1.禁止編譯器對(duì)變量進(jìn)行優(yōu)化,確保每次訪(fǎng)問(wèn)都會(huì)從內(nèi)存中讀取或?qū)懭搿?/p>
2.保證多線(xiàn)程環(huán)境下對(duì)變量的讀寫(xiě)操作是可見(jiàn)的,即一個(gè)線(xiàn)程對(duì)變量的修改能夠立即被其他線(xiàn)程看到。
下面是一個(gè)簡(jiǎn)單的示例,演示了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線(xiàn)程中讀取flag變量時(shí),能夠立即看到toggleThread線(xiàn)程對(duì)flag變量的修改。這樣就能保證printFlag()方法中打印的flag值是及時(shí)更新的。