Volatile

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
原子性 无法保障 可以保障 可以保障 可以保障
可见性 可以保障 可以保障 可以保障 可以保障
有序性 一定程度保障 可以保障 可以保障 无法保障

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容