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

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 加载时机

  • 静态内部类是在程序中调用静态内部类的时候加载的,和外部类的加载没有必然关系。但是如果在加载静态内部类的时候发现外部类还没有加载,那么就会先加载外部类,加载完外部类之后,再加载静态内部类。如果在程序中单纯的使用外部类,并不会触发静态内部类的加载
相关推荐
top_designer5 小时前
Substance 3D Stager:电商“虚拟摄影”工作流
人工智能·3d·设计模式·prompt·技术美术·教育电商·游戏美术
lapiii3586 小时前
[智能体设计模式] 第11章:目标设定与监控模式
人工智能·设计模式
在未来等你9 小时前
AI Agent设计模式 Day 7:Tree-of-Thoughts模式:树形思维探索
设计模式·llm·react·ai agent·plan-and-execute
烤麻辣烫10 小时前
23种设计模式(新手)-5里氏替换原则
java·学习·设计模式·intellij-idea·里氏替换原则
g***B73810 小时前
前端组件设计模式,复用与扩展
前端·设计模式
桦说编程11 小时前
如果让我从头再来学习并发编程
java·设计模式·性能优化
明洞日记13 小时前
【设计模式手册006】建造者模式 - 复杂对象的优雅构建之道
java·设计模式·建造者模式
ZHE|张恒13 小时前
设计模式(二)工厂方法模式 — 把创建权限下放给子类,像“可扩展的生产线”
java·开发语言·设计模式
明洞日记14 小时前
【设计模式手册008】适配器模式 - 让不兼容的接口协同工作
java·设计模式·适配器模式
@老蝴15 小时前
Java EE - 多线程下单例模式的设计
单例模式·java-ee·intellij-idea