併發編程之 - Volatile線程可見性:保證了線程間共享變量的及時可見性

什麼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);
}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章