首页 > 其他 > 详细

双重校验实现单例模式为什么需要volatile关键字

时间:2020-06-08 19:33:52      阅读:66      评论:0      收藏:0      [点我收藏+]

我们先来看下双重校验模式的标准代码:

public class Singleton1 {
    private static volatile Singleton1 singleton;

    private Singleton1(){}

    public static Singleton1  getStance(){
        if(singleton == null){

            synchronized (Singleton1.class){
                if (singleton == null){
                    singleton = new Singleton1();
                }
            }
        }
        return singleton;
    }
}

其次,我们应该知道,synchronized 能保证临界区的原子性、有序性和可见性。volatile 也能保证所修饰对象的可见性,并且还能禁止重排序。
那么问题就来了:既然 volatile 的功能 synchronized基本都具备,那为啥还需要 volatile 修饰单例对象呢?
我找了很多资料和博客,基本都是解释 new 操作不是原子操作,在 JVM 层面会导致重排序,但是这并不能解释为什么 volatile 和 synchronized 关于有序性功能的重叠。

      // 这是临界区,synchronized 只能保证有序性。
    if (singleton == null){
        singleton = new Singleton1();
    }  

关于这个问题,我思考良久,最后我找到 synchronized 关于有序性的解释:只能保证有序性却不能禁止重排序。

双重校验实现单例模式为什么需要volatile关键字

原文:https://www.cnblogs.com/melonman/p/13067678.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!