14.8 volatile關鍵字

在多線程編程中,若干個線程爲了可以實現公共資源的操作,往往是複製相應變量的副本,待操作完成後再將副本變量數據與原始變量進行同步處理。如下圖。如果開發者不希望通過副本數據進行操作,而是希望可以直接進行原始變量的操作(節約了複製變量副本與同步的時間),則可以在變量聲明時使用volatile關鍵字。
在這裏插入圖片描述
範例:使用volatile關鍵字定義變量

public class MyThread336 implements Runnable {
     private volatile int ticket=3;       //直接內存操作
	@Override
	public void run() {
		synchronized (this) {    //同步處理
			while(this.ticket>0) {
				try {
					Thread.sleep(100);         //延遲模擬
				} catch (InterruptedException e) {
					
					e.printStackTrace();
				}    
				System.out.println(Thread.currentThread().getName()+"賣票處理,ticket="+this.ticket--);
			}
		}

	}

}

public class ThreadDemo336 {
      public static void main(String[] args) {
    	  MyThread336 mt=new MyThread336();
    	  new Thread(mt,"售票員A").start();
    	  new Thread(mt,"售票員B").start();
    	  new Thread(mt,"售票員C").start();
	}
}

執行結果

售票員A賣票處理,ticket=3
售票員A賣票處理,ticket=2
售票員A賣票處理,ticket=1

本程序定義ticket屬性時使用了volatile關鍵字進行定義,這樣就表示該變量在進行操作時將直接會進行原始變量內容的處理。

volatile與synchronized的區別
答:volatile無法描述同步的處理,他只是一種直接內存的處理,避免了副本的操作,而synchronized是實現同步操作的關鍵字。此外,volatile主要在屬性上使用,而synchronized是在代碼塊與方法上使用。

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