Volatile
1、 禁止指令重排,單線程情況下jvm指令重排優(yōu)化執(zhí)行順序不影響最終結(jié)果喂很,多線程下可能引起線程安全問(wèn)題别瞭,volatile通過(guò)內(nèi)存屏障禁止指令重排保證有序性。
2洽瞬、保證可見(jiàn)性,被修飾的變量強(qiáng)制讀取主內(nèi)存,不讀取cpu的高速緩存枢冤。
//保證可見(jiàn)性
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("發(fā)生亂序");
}
}
public static void main(String[] args) {
VolatileTest1 t = new VolatileTest1();
new Thread(() -> {
while (true){
t.add();
}
}).start();
new Thread(() -> {
while (true){
t.check();
}
}).start();
}
并發(fā)三特性總結(jié)
特性 volatile synchronized Lock Atomic
原子性 無(wú)法保障 可以保障 可以保障 可以保障
可見(jiàn)性 可以保障 可以保障 可以保障 可以保障
有序性 一定程度保障 可以保障 可以保障 無(wú)法保障