JAVA之单例模式

单例模式(Singleton Pattern)是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在软件设计中,单例模式常用于控制对资源的访问,例如数据库连接、线程池等。以下是单例模式的详细介绍及JAVA代码实现。

一、单例模式的优点

  • 控制资源的使用,避免资源的多重占用。
  • 提供全局访问点,方便资源的管理。
  • 系统中只有一个实例,减少内存开销。
  • 避免对资源的多重占用,提高系统的性能。

二、单例模式的缺点

  • 单例模式可能会引起代码的不透明性。
  • 单例模式可能会导致代码的测试困难。
  • 单例模式可能会导致并发问题。

三、单例模式的实现方式 单例模式有多种实现方式,以下列举几种常见的实现方式:

  • 懒汉式(线程不安全)
  • 懒汉式(线程安全)
  • 饿汉式
  • 双重校验锁
  • 静态内部类
  • 枚举 以下分别对这几种实现方式进行详细说明及代码实现。
  • 懒汉式(线程不安全) 懒汉式单例模式在类加载时不初始化,在需要时才创建实例。缺点是线程不安全。
  1. JAVA代码实现:
java 复制代码
public class Singleton {
    // 私有静态变量,用于存储单例实例
    private static Singleton instance;
    // 私有构造方法,防止外部直接创建实例
    private Singleton() {}
    // 公有静态方法,用于获取单例实例
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  1. 懒汉式(线程安全) 在懒汉式的基础上,通过同步方法保证线程安全。缺点是效率较低。 JAVA代码实现:
java 复制代码
public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    // 同步方法,保证线程安全
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  1. 饿汉式 饿汉式单例模式在类加载时就完成了初始化,保证了线程安全。缺点是类加载时就初始化,可能会浪费资源。 JAVA代码实现:
java 复制代码
public class Singleton {
    // 私有静态变量,类加载时初始化
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}
  1. 双重校验锁 双重校验锁单例模式在懒汉式的基础上,通过双重校验锁保证线程安全,同时提高效率。 JAVA代码实现:
java 复制代码
public class Singleton {
    // 私有静态变量,使用volatile关键字保证多线程下的可见性和禁止指令重排序
    private static volatile Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
  1. 静态内部类 静态内部类单例模式利用静态内部类的特性,实现懒加载和线程安全。 JAVA代码实现:
java 复制代码
public class Singleton {
    // 私有构造方法
    private Singleton() {}
    // 静态内部类,用于持有单例实例
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    // 公有静态方法,获取单例实例
    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
  1. 枚举 枚举单例模式利用枚举的特性,实现单例,且自动支持序列化机制,防止反射攻击。 JAVA代码实现:
java 复制代码
public enum Singleton {
    // 枚举元素,本身就是单例
    INSTANCE;
    // 公有方法,可以添加其他业务方法
    public void doSomething() {
        // 业务逻辑
    }
}

四、总结

单例模式是一种简单且常用的设计模式,适用于需要确保一个类只有一个实例的场景。在实际开发中,应根据具体需求选择合适的实现方式。

相关推荐
晨星05271 天前
软件设计模式之单例模式
单例模式·设计模式
code bean3 天前
【wpf】WPF开发避坑指南:单例模式中依赖注入导致XAML设计器崩溃的解决方案
单例模式·wpf
是三好4 天前
单例模式(Singleton Pattern)
java·开发语言·算法·单例模式
青春易逝丶5 天前
单例模式
单例模式
YA3335 天前
java设计模式一、单例模式
java·单例模式·设计模式
枫景Maple5 天前
Unity中多线程与高并发下的单例模式
unity·单例模式·游戏引擎
iiiiaaiashah6 天前
单例模式的mock类注入单元测试与友元类解决方案
java·开发语言·单例模式
jingfeng5149 天前
线程池及线程池单例模式
linux·开发语言·单例模式
Brookty9 天前
深入解析Java并发编程与单例模式
java·开发语言·学习·单例模式·java-ee
Meteors.10 天前
23种设计模式——单例模式(Singleton)详解
单例模式·设计模式