7 种单例模式设计

作者: Tim在路上 | 来源:发表于2019-11-05 17:25 被阅读0次

饿汉式

// final 不允许被继承 
public final class Singleton {
    
    // 饿汉式,先new
    private static Singleton singleton = new Singleton();
    
    // 私有构造不允许外部 new
    private Singleton(){
        
    }
    
    public static Singleton getInstance(){
        return singleton;
    }
    
}

饿汉式的问题是 instance 在被 ClassLoader加载后很长时间才能在使用,如果类中的资源是重资源,那么就必须使用懒汉式

懒汉式

// final 不允许被继承
public final class Singleton {

    // 饿汉式,先new
    private static Singleton singleton = null;

    // 私有构造不允许外部 new
    private Singleton(){
        
    }

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

问题是多线程下不能保证实例的唯一性。

懒汉式+ 同步

// 但是 只允许一个 线程 访问这个方法 ,效率就会很低

// final 不允许被继承
public final class Singleton {

    // 饿汉式,先new
    private static Singleton singleton = null;

    // 私有构造不允许外部 new
    private Singleton(){

    }

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

}

Double-check

//

// final 不允许被继承
public final class Singleton {

    // 饿汉式,先new
    // 不加 volatile 可能出现空指针异常 ,可能JVM指令的重排序
    private volatile static Singleton singleton = null;

    // 私有构造不允许外部 new
    private Singleton(){
    }
    // 双重校验,可以进入方法
    public static  Singleton getInstance(){
        if (singleton == null){
            synchronized(Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

Holder 实现静态的私有内部类

// final 不允许被继承
public final class Singleton {
    
    // 私有构造不允许外部 new
    private Singleton(){
         
    }

    private static class Holder{
        private static Singleton instance = new Singleton();
    }

    public static Singleton getInstance(){
        return Holder.instance;
    }
}

Singleton 类中,初始化过程中并不会创建 Singleton 的实例 ,只有当 Holder 类被主动引用的时候则会创建

枚举方式

枚举的方式不允许被继承,同时是线程安全的 ,只能被实例化一次

推荐使用枚举的方式

饿汉式

public enum  Singleton {

    INSTANCE;
    // 私有构造不允许外部 new
    private Singleton(){
        System.out.println("Instance will be init immediately");
    }
    //
    public static Singleton getInstance(){
        return INSTANCE;
    }
}

// 懒加载

把枚举作为内部类进行懒加载

public class Singleton {

    private Singleton(){

    }

    private enum EnumHolder{
        INSTANCE;
        private Singleton instance;
        
        EnumHolder(){
            this.instance = new Singleton();
        }
        
        private Singleton getInstance(){
            return instance;
        }
    }
    
    public static Singleton getInstance(){
        return EnumHolder.INSTANCE.getInstance();
    }
}

相关文章

  • 单例模式

    JAVA设计模式之单例模式 十种常用的设计模式 概念: java中单例模式是一种常见的设计模式,单例模式的写法...

  • iOS-单例模式

    swift的单例设计模式 OC的单例设计模式 新学习一种单例思想

  • JAVA多线程之线程安全的单例模式

    概念:java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。单例模式有一...

  • 单例设计模式

    单例设计模式 单例设计模式介绍 单例设计模式的八种方法2.1 饿汉式(静态常量)2.1.1 实现步骤2.1.2 代...

  • 关于java单例模式,这篇已经讲得很清楚了,建议收藏!

    概念 java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。 特点 单例...

  • Go语言设计模式(1)单例模式

    Go语言设计模式(1)单例模式 单例模式的定义 个人认为单例模式是23种设计模式中最简单也最好理解的一种,定义如下...

  • 设计模式与软件原则 (二):单例设计模式

    单例设计模式(Singleton Design Pattern) 单例设计模式是一种创造(creational)设...

  • 设计模式

    [TOC] #设计模式 --- ##单例模式 >[八种单例模式参考](http://cantellow.iteye...

  • 设计模式小结-单例模式

    1. 单例模式简述 单例模式相对于其他设计模式,应该是写的最熟悉的一种,但是单例又有很多种不同的实现方式(7-8种...

  • 单例模式

    概念 java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式模式,饿汉式模式、登记式单例三种。单例模式有以...

网友评论

    本文标题:7 种单例模式设计

    本文链接:https://www.haomeiwen.com/subject/ogdebctx.html