【学习日志】volatile关键字的作用

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。【学习日志】volatile关键字的作用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

  1. 消除指令重排序
  2. 保证了不同线程对变量进行操作时的可见性,cpu对变量值修改后,其他线程读取变量信息时从内存读取而非cpu缓存

使用场景:

1. 双重检查锁,防止重排序

uniqueSingleton = new Singleton();

赋值操作在编译后不是原子的,分为三步:

(1)分配内存空间

(2)初始化对象

(3)将引用对象指针指向分配的内存空间地址

如果重排序,可能出现:

(1)分配内存空间

(2)将引用对象指针指向分配的内存空间地址

(3)初始化对象

即如下代码,如果没有加volatile,指令重排序后则可能出现Thread1执行到赋值的第二步((2)将引用对象指针指向分配的内存空间地址),Thread2执行获取,拿到的是未完成初始化的对象

public class Singleton {
    private volatile static Singleton uniqueSingleton;

    private Singleton() {
    }

    public Singleton getInstance() {
        if (null == uniqueSingleton) {
            synchronized (Singleton.class) {
                if (null == uniqueSingleton) {
                    uniqueSingleton = new Singleton();
                }
            }
        }
        return uniqueSingleton;
    }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/206165.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!