volatile 关键字的作用

1.批改即可见
2.避免指令重排

批改即可见

读取 volatile 润饰的对象时,每次都从主内存中读取值
批改 volatile 润饰的对象时,批改后立即写入到主内存中
然而 volatile 无奈保障原子性,多个线程可能同时读取了最新的值,都基于这个值在工作内存中进行批改,并在批改后同步至主内存中,案例如下图

避免重排的意义

以下图为例,当产生指令重排时,A线程获取到锁,开始创建对象,B线程判断对象曾经不为空间接返回并应用,但理论对象并没有实现初始化,导致报错;volatile 字段的意义就在于禁止此处的指令进行重排

参考资料:
https://www.cnblogs.com/zhong...
https://www.miaokee.com/57027...
https://cloud.tencent.com/dev...