在多线程的编程中,若干个线程为了可以实现公共资源的操作,往往是赋值相应变量的副本,待操作完成后,再将此副本变量数据与原始变量进行同步处理。如果我们不希望通过副本数据进行操作,而是希望可以直接进行原始变量的操作(节约了赋值变量副本与同步的时间),则可以在变量声明时使用volatile关键字。
1、使用volatile关键字定义变量:
package com.mydemo;
public class ThreadDemo {
public static void main(String[] args) {
MyThread myThread = new MyThread();
new Thread(myThread, "售票员B").start();
new Thread(myThread, "售票员C").start();
new Thread(myThread, "售票员A").start();
}
}
class MyThread implements Runnable {
/**
* volatile与synchronized的区别:
* 1、volatile无法描述同步的处理,它只是一种直接内存的处理,避免了副本的操作,而synchronized是实现同步操作的关键字。
* 2、volatile主要在属性上使用,而synchronized是在代码块与方法上使用的
*/
// 直接内存操作
private volatile int ticket = 30;
@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--);
}
}
}
}