在多線程編程中,若干個線程爲了可以實現公共資源的操作,往往是複製相應變量的副本,待操作完成後再將副本變量數據與原始變量進行同步處理。如下圖。如果開發者不希望通過副本數據進行操作,而是希望可以直接進行原始變量的操作(節約了複製變量副本與同步的時間),則可以在變量聲明時使用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是在代碼塊與方法上使用。