在多线程编程中,若干个线程为了可以实现公共资源的操作,往往是复制相应变量的副本,待操作完成后再将副本变量数据与原始变量进行同步处理。如下图。如果开发者不希望通过副本数据进行操作,而是希望可以直接进行原始变量的操作(节约了复制变量副本与同步的时间),则可以在变量声明时使用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是在代码块与方法上使用。