Volatile
1、 禁止指令重排,单线程情况下jvm指令重排优化执行顺序不影响最终结果,多线程下可能引起线程安全问题,volatile通过内存屏障禁止指令重排保证有序性。
2、保证可见性,被修饰的变量强制读取主内存,不读取cpu的高速缓存。
//保证可见性
private static volatile boolean flag = true;
public static void main(String[] args) throws InterruptedException {
new Thread(
() -> {
long start = System.currentTimeMillis();
while (flag){
}
System.out.println(System.currentTimeMillis()-start);
System.out.println("end");
}
).start();
Thread.sleep(100);
flag = false;
}
指令重排
int a,b,c,d;
void add(){
a += 1;
b += 1;
c += 1;
d += 1;
}
void check(){
if(d>a){
System.out.println("发生乱序");
}
}
public static void main(String[] args) {
VolatileTest1 t = new VolatileTest1();
new Thread(() -> {
while (true){
t.add();
}
}).start();
new Thread(() -> {
while (true){
t.check();
}
}).start();
}
并发三特性总结
特性 volatile synchronized Lock Atomic
原子性 无法保障 可以保障 可以保障 可以保障
可见性 可以保障 可以保障 可以保障 可以保障
有序性 一定程度保障 可以保障 可以保障 无法保障