volatile关键字

弄懂volatile之前首先确保弄懂了java内存模型,可参考我的整理
Java内存模型

volatile的作用如下:

  1. 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
  2. 禁止进行指令重排序。(涉及volatile变量的代码的前面和后面的代码不会进行重排序)。

注意:

  1. volatile不保证被修饰的变量的操作的原子性(要保证操作的原子性建议使用同步:synchronized和Lock)。

使用场景:

  • 标记状态量:
volatile boolean flag = false;
 
while(!flag){
    doSomething();
}
 
public void setFlag() {
    flag = true;
}
//保证了线程1的语句一一定在语句二之前执行(因为volatile禁止重排序),
// 否则可能会线程1的语句二先执行,这时线程2的while循环跳出,
// 立刻执行doSomethingWithConfig(context);
// 此时context还没赋值,出现空指针异常。
volatile boolean inited = false;
//线程1:
context = loadContext();  //语句一
inited = true;            //语句二
 
//线程2:
while(!inited ){
sleep()
}
doSomethingWithConfig(context);
  • double check:
class Singleton{
    private volatile static Singleton instance = null;
     
    private Singleton() {
         
    }
     
    public static Singleton getInstance() {
        if(instance==null) {
            synchronized (Singleton.class) {
                if(instance==null)
                    instance = new Singleton();
            }
        }
        return instance;
    }
}

参考:Java并发编程:volatile关键字解析

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • volatile 关键字解析 原文出处: 海子volatile 这个关键字可能很多朋友都听说过,或许也都用过。在 ...
    常青大侠阅读 666评论 0 4
  • 此文章出自:<a href="http://www.cnblogs.com/dolphin0520/p/39203...
    zlb阅读 733评论 0 6
  • 窗外的明月如夜之瞳孔, 凝视着银色的笔尖, 深情脉脉。 婉约的笔迹如火凤飞舞, 心中那片寂静的水面上, 刹那涟漪荡...
    蝶之语阅读 420评论 0 2
  • 1 走出地铁站,任远博士听到江州市区传来的敲钟声,时间是下午四点。 冬日的寒风夹杂着落叶,阳光透过薄薄的雾霾,斜斜...
    Dr_Sherlock阅读 1,119评论 0 2
  • 使用 iOS 10 系统的朋友,如果出现「网络连接失败」错误,无法登录小密圈,点击「重新登录」也无法正常访问小密圈...
    唯奇点阅读 384评论 0 0

友情链接更多精彩内容