在多线程的定义之中,volatile关键字主要是在属性上使用的,表示此属性为直接数据操作,不会进行副本的拷贝处理。
在正常进行变量处理的时候往往会经历如下几个步骤:
1、获取变量原有的数据内容副本
2、利用副本为变量进行数学计算
3、将计算后的变量,保存到原始空间之中
如图;
如果一个属性上追加了volatile关键字,表示的就是直接操作原始变量,相当于节约了拷贝副本,重新保存的步骤。
通过使用volatile关键字可以更加方便的实现线程同步
例:如下为简单的抢票Demo
package TestDemo.ThreadDemo;
/**
* @Derscription TODO
* @auther David
* @date 2018-09-03 15:16
* @Version 1.o
*/
public class VolatileDemo {
public static void main(String[] args) {
MyThread1 mt = new MyThread1();
new Thread(mt, "票贩子1").start();
new Thread(mt, "票贩子2").start();
new Thread(mt, "票贩子3").start();
}
}
class MyThread1 implements Runnable {
private volatile int ticket = 10;//直接内存操作
@Override
public void run() {
synchronized (this) {//使用synchronized同步代码块
while (this.ticket > 0) {
try {
Thread.sleep(1);//模拟网络延迟
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ",.ticket=" + this.ticket--);
}
}
}
}
但是,volatile与synchronized是不同的,有常见面试题如下:
请解释volatile与synchronized的区别?
参考答案:
1、volatile主要在属性上使用,而synchronized实在代码块与方法上使用的;
2、volatile无法描述同步的处理,它只是一种直接内存的处理,避免了副本的操作;synchronized可以描述同步的处理。