Volatile: JVM提供的轻量级的同步机制
volatile三大特性
不加volatile关键字代码演示
public class VolitileDemo {
public static void main(String[] args) {
MyData myData = new MyData();
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
myData.add60();
System.out.println(Thread.currentThread().getName() + "将number修改为:" +myData.number);
}, "线程A").start();
while(myData.number==0) {
}
System.out.println(Thread.currentThread().getName() + "线程的number的值为:" +myData.number);
}
}
class MyData{
int number = 0;
public void add60(){
this.number = 60;
}
}
- 输出结果: 线程A将number修改为:60
整个程序并没有运行完,说明主线程number的值为0
加上volatile关键字代码演示
public class VolitileDemo {
public static void main(String[] args) {
MyData myData = new MyData();
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
myData.add60();
System.out.println(Thread.currentThread().getName() + "将number修改为:" +myData.number);
}, "线程A").start();
while(myData.number==0) {
}
System.out.println(Thread.currentThread().getName() + "线程的number的值为:" +myData.number);
}
}
class MyData{
volatile int number = 0;
public void add60(){
this.number = 60;
}
}
- 输出结果:
线程A将number修改为:60
main线程的number的值为:60 - 说明主线程的number为60