栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

懒汉式单例模式的问题和Double Check

Java 更新时间:发布时间: 百科书网 趣学号
单例模式是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。

该模式有三个基本要点:

  • 这个类只能有一个实例;
  • 它必须自行创建这个实例;
  • 它必须自行向整个系统提供这个实例。
懒汉式单例模式,使用的时候才创建
  • 但懒汉式单例在多线程情况下会出现一个问题, 就是在多线程情况下会出现单例对象会创建多个实例;

class Singleton {
    private static Singleton singleton;

    private Singleton(){}

    public static Singleton getInstance(){
        if(singleton == null){
            singleton = new Singleton();
        }

        return singleton;
    }
}
解决多线程单例对象会创建多个实例的问题,有多个解决方案:
  • 使用锁
class Singleton2 {
    private static Singleton2 singleton2;

    private Singleton2(){}

    
    public static synchronized Singleton2 getInstance(){
        if(singleton2 == null){
            singleton2 = new Singleton2();
        }

        return singleton2;
    }
}
  • Double Check做法:锁前、锁后检查两次单例对象是否存在
class Singleton3 {
    private static Singleton3 singleton3;

    private Singleton3(){}

    public static Singleton3 getInstance(){
        if(singleton3 == null){
            synchronized (Singleton3.class){
                if(singleton3 == null){
                    singleton3 = new Singleton3();
                }
            }
        }

        return singleton3;
    }
}
  • 为了解决Double Check中出现指令重排的问题,我们可以使用volatile关键字,volatile关键字可以使得其修饰的变量实现可见性和有序性,但不能解决原子性。
class Singleton4 {
    private volatile static Singleton4 singleton4;

    private Singleton4(){}

    public static Singleton4 getInstance(){
        if(singleton4 == null){
            synchronized (Singleton4.class){
                if(singleton4 == null){
                    singleton4 = new Singleton4();
                }
            }
        }

        return singleton4;
    }
}
  • SingletonHolder解决Double Check的指令重排序问题
class Singleton5 {
    private static class SingletonHolder{
        public static Singleton5 singleton5 = new Singleton5();
    }

    public static Singleton5 getInstance(){
        return SingletonHolder.singleton5;
    }
}

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/273508.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号