什麼是Volatile
Volatile 保證了線程間共享變量的及時可見性,但不能保證原子性。
可見性也就是說一旦某個線程修改了該被volatile修飾的變量,它會保證修改的值會立即被更新到主存,當有其他線程需要讀取時,可以立即獲取修改之後的值。
在Java中爲了加快程序的運行效率,對一些變量的操作通常是在該線程的寄存器或是CPU緩存上進行的,之後纔會同步到主存中,而加了volatile修飾符的變量則是直接讀寫主存。
案例:
案例說明:創建一個線程啓動while(flag)循環,等3m過後,設置flag值爲false,但是while循環並沒停止。
解決:全局變量添加volatile可見性關鍵字。
class ThreadDemo004 extends Thread {
public boolean flag = true;
// public volatile boolean flag = true;
@Override
public void run() {
System.out.println("線程開始...");
while (flag) {
// 死循環
}
System.out.println("線程結束...");
}
// 啓動死循環\停止死循環
public void setRuning(boolean flag){
this.flag=flag;
}
}
public class Test0004 {
public static void main(String[] args) throws InterruptedException {
ThreadDemo004 th = new ThreadDemo004();
th.start();
Thread.sleep(3000);
th.setRuning(false);
System.out.println("flag已經改為false");
Thread.sleep(1000);
System.out.println("flag:"+threadDemo004.flag);
}
}