volatile是Java虚拟机提供的轻量级的同步机制
volatile三大特性
- 保证可见性
- 不保证原子性
- 禁止指令重排序
volatile的可见性
可见性Demo
- 思路
在AAA线程中修改MyData的number值,在main线程中观察值是否已经改变。 - 代码部分
/**
* @author lijiayin
*/
public class VolatileDemo {
public static void main(String[] args) {
MyData myData = new MyData();
new Thread(() -> {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
myData.to60();
System.out.println("update");
}, "AAA").start();
while (myData.number == 0){
}
System.out.println("finish");
}
}
class MyData{
int number = 0;
void to60(){
number = 60;
}
}
-
运行结果
程序输出“update”后,一直在运行;main线程不知道此时number的值已经修改
运行结果.png - 将MyData的number加上volatile关键字
package com.interview.concurrency.example.thread;
/**
* @author lijiayin
*/
public class VolatileDemo {
public static void main(String[] args) {
MyData myData = new MyData();
new Thread(() -> {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
myData.to60();
System.out.println("update");
}, "AAA").start();
while (myData.number == 0){
}
System.out.println("finish");
}
}
class MyData{
volatile int number = 0;
void to60(){
number = 60;
}
}
-
运行结果
程序在AAA线程更新number的值后,main线程发现了值的修改,程序结束。
运行结果.png - 结论
volatile关键字修饰的属性,被修改并写回主内存时,其他线程都会收到通知,保证了对其他线程的可见性。
网友评论