设计模式-单例模式(静态内部类)

1. 概念

  • 保证一个类只有一个实例
  • 并为该实例提供一个全局唯一的访问节点

2. 双重检查

2.1 代码示例

示例
java 复制代码
/**
 * @Description: 静态内部类:懒加载,并且线程安全
 */
public class Singleton07 {

    private Singleton07() {}

    /**
     * 写一个静态内部类,该类中有一个静态属性
     */
    private static class SingletonInstance {
        private static final Singleton07 INSTANCE = new Singleton07();
    }

    /**
     * 提供一个静态的公有方法,直接返回SingletonInstance.IINSTANCE
     * @return Singleton07
     */
    public static Singleton07 getInstance() {
        return SingletonInstance.INSTANCE;
    }
}
java 复制代码
public class SingletonTest07 {
    public static void main(String[] args) {
        Singleton07 instance = Singleton07.getInstance();
        Singleton07 instance1 = Singleton07.getInstance();
        System.out.println(instance == instance1);
        System.out.println("instance.hashCode= " + instance.hashCode());
        System.out.println("instance1.hashCode= " + instance1.hashCode());
    }
}

2.2 优缺点

  1. 这种方式采用了类装载的机制来保证初始化实例时只有一个线程
  2. 静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getinstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。
  3. 类的静态属性只会在第一次加载类的时候初始化,所以在这里JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。
  4. 避免了线程不安全,利用静态内部类特点实现延迟加载,效率高。

2.3 结论

  • 线程安全,延迟加载,效率高,在实际开发中,推荐使用这种单例设计模式。

3. 题外篇:静态内部类

3.1 加载时机

  • 静态内部类是在程序中调用静态内部类的时候加载的,和外部类的加载没有必然关系。但是如果在加载静态内部类的时候发现外部类还没有加载,那么就会先加载外部类,加载完外部类之后,再加载静态内部类。如果在程序中单纯的使用外部类,并不会触发静态内部类的加载
相关推荐
码匠许师傅4 小时前
【设计模式精讲】29.行为型模式总结与对比(Behavioral Patterns Summary)
c++·设计模式·uml
geovindu8 小时前
CSharp: Observer Pattern
开发语言·后端·观察者模式·设计模式·c#·.netcore·行为模式
YHHLAI21 小时前
NestJS 后端开发实战:从设计模式到 CRUD 全栈
设计模式
2401_868534782 天前
长远目标 Long-term Goal 老题沿用
设计模式·需求分析
吃饱了得干活2 天前
Java设计模式实战:一个支付模块的重构之旅,层层递进理解设计模式精髓
后端·设计模式·架构
vivo互联网技术2 天前
软件不是从数据开始,而是从现实开始 | KDC 系列 01
设计模式·架构·领域驱动设计
码匠许师傅2 天前
【设计模式精讲】27.模板方法模式(Template Method)
c++·设计模式·uml·模板方法模式
码匠许师傅2 天前
【设计模式精讲】28.访问者模式(Visitor)
java·设计模式·访问者模式
码匠许师傅2 天前
【设计模式精讲】26.策略模式(Strategy)
c++·设计模式·策略模式·uml
Ysx3 天前
AI 问答不再"一本正经地胡说":30 轮提示词迭代,沉淀 4 条防幻觉铁律
设计模式