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

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

  • 静态内部类是在程序中调用静态内部类的时候加载的,和外部类的加载没有必然关系。但是如果在加载静态内部类的时候发现外部类还没有加载,那么就会先加载外部类,加载完外部类之后,再加载静态内部类。如果在程序中单纯的使用外部类,并不会触发静态内部类的加载
相关推荐
YXLY25282 小时前
庭院大门选型方案:铝艺大门的五大设计模式与六大性能优势分析
设计模式
磊 子7 小时前
C++设计模式
javascript·c++·设计模式
许彰午10 小时前
34_Java设计模式之单例模式
java·单例模式·设计模式
小雨青年11 小时前
GitHub Actions 可复用工作流设计模式:把 CI/CD 重复逻辑收起来
ci/cd·设计模式·github
石一峰6991 天前
C 语言函数设计模式实战经验
c语言·开发语言·设计模式
qq_297574671 天前
设计模式系列文章(基础篇第22篇):访问者模式——分离数据结构与操作,实现灵活扩展
数据结构·设计模式·访问者模式
刀法如飞2 天前
领域驱动 vs 本体驱动:DDD 代码建模与 Ontology 语义建模的对比分析
设计模式·架构设计·领域驱动
我爱cope2 天前
【Agent智能体26 | 多智能体-多智能体工作流】
人工智能·设计模式·语言模型·职场和发展
咖啡八杯2 天前
【无标题】
java·后端·设计模式