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是在代码块与方法上使用。

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