当前位置: 移动技术网 > IT编程>开发语言>Java > 实战java设计模式--单例模式

实战java设计模式--单例模式

2020年11月12日  | 移动技术网IT编程  | 我要评论
目录1 介绍2 实现方式2.1 饿汉式(静态变量)2.2 饿汉式(静态代码块)2.3 懒汉式(线程不安全)2.4 懒汉式(线程安全)2.5 双重校验锁2.6 静态内部类方式2.7 枚举方式3 总结1 介绍单例模式属于创建型模式。单例模式创建的单例类只能有一个实例,并且是自己创建自己的唯一实例。使用场景:整个项目的配置类、项目的工具类等等。2 实现方式实现关键步骤:构造器私有化;(不让别人new)持有一个自己类型的引用;(怎么创建按照具体方法来)返回一个具体实例的方法;(给别人使用)同时

1 介绍

单例模式属于创建型模式。单例模式创建的单例类只能有一个实例,并且是自己创建自己的唯一实例。
使用场景:整个项目的配置类、项目的工具类等等。

2 实现方式

实现关键步骤:

  • 构造器私有化;(不让别人new)
  • 持有一个自己类型的引用;(怎么创建按照具体方法来)
  • 返回一个具体实例的方法;(给别人使用)

同时关注两个问题:是否线程安全?是否支持懒加载?

2.1 饿汉式(静态变量)

//饿汉式
class Singleton{
    //1.构造器私有化,别人不能new
    private Singleton(){};
    //2.本类内部创建对象实例
    private final static Singleton instance = new Singleton();
    //3. 提供一个共有的静态方法按返回实例
    public static Singleton getInstance(){
        return instance;
    }
}

类加载时就初始化。
是否线程安全:是
是否支持懒加载:否

2.2 饿汉式(静态代码块)

//饿汉式(静态代码块)
class Singleton{
    //私有变量
    private static Singleton instance;
    //1.构造器私有化,别人不能new
    private Singleton(){}
    //2.静态代码代码块里面创建
    static {
        instance=new Singleton();
    }
    //3. 提供一个共有的静态方法按返回实例
    public static Singleton getInstance(){
        return instance;
    }
}

类加载时就初始化。
是否线程安全:是
是否支持懒加载:否

2.3 懒汉式(线程不安全)

//懒汉式(线程不安全)
class Singleton {
    //私有变量
    private static Singleton instance;
    //1.构造器私有化,别人不能new
    private Singleton() {
    }
    //2. 提供一个共有的静态方法按返回实例
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

是否线程安全:否
是否支持懒加载:是

2.4 懒汉式(线程安全)

//懒汉式(线程安全)
class Singleton {
    //私有变量
    private static Singleton instance;
    //1.构造器私有化,别人不能new
    private Singleton() {
    }
    //2. 提供一个共有的静态方法按返回实例
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

在获得实例函数上加锁。
是否线程安全:是
是否支持懒加载:是

2.5 双重校验锁

懒汉式(线程安全)的方式虽然可线程安全,但是这样加锁效率较低。

//双重校验锁
class Singleton {
    //私有变量
    private static volatile Singleton instance;//注意关键字volatile
    //1.构造器私有化,别人不能new
    private Singleton() {
    }
    //2. 提供一个共有的静态方法按返回实例
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

双重校验体现在双重判断是否为空。
是否线程安全:是
是否支持懒加载:是

2.6 静态内部类方式

//静态内部类方式
class Singleton {
    //1.构造器私有化,别人不能new
    private Singleton() {
    }
    //2.静态内部类
    private static class SingleInstance{
        private static final Singleton INSTANCE=new Singleton();
    }
    //3. 提供一个共有的静态方法按返回实例
    public static synchronized Singleton getInstance() {
        return SingleInstance.INSTANCE;
    }
}

在getInstance调用时才加载SingleInstance类。
是否线程安全:是
是否支持懒加载:是

2.7 枚举方式

//枚举方式
enum Singleton {
    INSTANCE;
    public void whateverMethod() {
        System.out.println("ok!");
    }
}

jdk 1.5之后才支持
是否线程安全:是
是否支持懒加载:否

3 总结

单例模式最重要的知识点在于其创建模式,要保证多线程安全的同时又能达到懒加载是最好的实现方式。
最易想到的应该是懒汉式(线程安全)的方法,但是对于静态代码块、静态内部类、枚举的骚操作也应该有所掌握。

本文地址:https://blog.csdn.net/weixin_44215363/article/details/109636770

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网