单例模式的实现方式

饿汉式单例(静态常量初始化)

// 饿汉式单例,线程安全,类加载时初始化实例
public class SingletonHungry {
    // 使用私有构造函数防止外部实例化
    private SingletonHungry() {}

    // 类加载时创建单例对象并赋值给静态final变量,保证线程安全
    private static final SingletonHungry INSTANCE = new SingletonHungry();

    // 提供公共的静态方法返回唯一的实例
    public static SingletonHungry getInstance() {
        return INSTANCE;
    }
}

懒汉式单例(线程不安全)

// 懒汉式单例(非线程安全版)
public class SingletonLazyUnsafe {
    private static SingletonLazyUnsafe instance;

    private SingletonLazyUnsafe() {}

    // 第一次调用getInstance方法时创建实例,但这种方法在多线程环境下不安全
    public static SingletonLazyUnsafe getInstance() {
        if (instance == null) {
            instance = new SingletonLazyUnsafe();
        }
        return instance;
    }
}

懒汉式单例(线程安全,同步方法)

// 懒汉式单例(线程安全版,同步方法)
public class SingletonLazySafeSyncMethod {
    private static SingletonLazySafeSyncMethod instance;

    private SingletonLazySafeSyncMethod() {}

    // 使用synchronized关键字同步方法以确保线程安全
    public static synchronized SingletonLazySafeSyncMethod getInstance() {
        if (instance == null) {
            instance = new SingletonLazySafeSyncMethod();
        }
        return instance;
    }
}

懒汉式单例(线程安全,双重检查锁定)

// 懒汉式单例(线程安全版,双重检查锁定DCL - Double Checked Locking)
public class SingletonLazySafeDCL {
    private volatile static SingletonLazySafeDCL instance; // 使用volatile防止指令重排序

    private SingletonLazySafeDCL() {}

    public static SingletonLazySafeDCL getInstance() {
        if (instance == null) {
            synchronized (SingletonLazySafeDCL.class) {
                // 第二次检查,只有在null的情况下才会进入下面的new操作
                if (instance == null) {
                    instance = new SingletonLazySafeDCL();
                }
            }
        }
        return instance;
    }
}

在上述代码中,饿汉式单例在类被加载时就完成了实例化,所以它是线程安全的;而懒汉式单例则是在第一次调用getInstance方法时才进行实例化,为了解决线程安全问题,懒汉式单例可以通过同步方法或双重检查锁定机制来确保多线程环境下的安全性。其中,双重检查锁定(DCL)是常用的优化手段,它既保证了线程安全,也避免了每次都进行同步操作带来的性能损耗。

相关推荐

  1. 模式实现方式

    2024-03-23 08:10:05       21 阅读
  2. 模式实现方式总结

    2024-03-23 08:10:05       11 阅读
  3. 模式几种实现方式

    2024-03-23 08:10:05       26 阅读
  4. 模式几种实现方式

    2024-03-23 08:10:05       20 阅读
  5. 模式:双重效验锁懒汉实现方式

    2024-03-23 08:10:05       18 阅读
  6. 模式几种实现方式

    2024-03-23 08:10:05       12 阅读
  7. C#模式简单实现

    2024-03-23 08:10:05       27 阅读
  8. C++模式实现

    2024-03-23 08:10:05       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-23 08:10:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-23 08:10:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-23 08:10:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-23 08:10:05       20 阅读

热门阅读

  1. 懒汉式【单例模式】

    2024-03-23 08:10:05       18 阅读
  2. 设计模式(行为型设计模式——状态模式)

    2024-03-23 08:10:05       17 阅读
  3. 【PHP】通过PHP开启/暂停Apache、MySQL或其他服务

    2024-03-23 08:10:05       21 阅读
  4. OpenCV基于阈值的分割技术详细介绍

    2024-03-23 08:10:05       19 阅读
  5. 数仓建模架构—Inmon范式建模与Kimball维度建模

    2024-03-23 08:10:05       21 阅读
  6. LeetCode //C - 75. Sort Colors

    2024-03-23 08:10:05       19 阅读
  7. 【LeetCode-153.寻找旋转排序数组的最小值】

    2024-03-23 08:10:05       22 阅读
  8. DDD中如何识别子域、实体、值对象和聚合

    2024-03-23 08:10:05       19 阅读
  9. 解决微信小程序页面数量限制问题的6种方法

    2024-03-23 08:10:05       76 阅读
  10. 微信小程序实现图片懒加载的4种方案

    2024-03-23 08:10:05       15 阅读
  11. mapbox 获取当前比例尺 scale

    2024-03-23 08:10:05       18 阅读