单例模式(Singleton Pattern)是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在软件设计中,单例模式常用于控制对资源的访问,例如数据库连接、线程池等。以下是单例模式的详细介绍及JAVA代码实现。
一、单例模式的优点
- 控制资源的使用,避免资源的多重占用。
- 提供全局访问点,方便资源的管理。
- 系统中只有一个实例,减少内存开销。
- 避免对资源的多重占用,提高系统的性能。
二、单例模式的缺点
三、单例模式的实现方式 单例模式有多种实现方式,以下列举几种常见的实现方式:
- 懒汉式(线程不安全)
- 懒汉式(线程安全)
- 饿汉式
- 双重校验锁
- 静态内部类
- 枚举 以下分别对这几种实现方式进行详细说明及代码实现。
- 懒汉式(线程不安全) 懒汉式单例模式在类加载时不初始化,在需要时才创建实例。缺点是线程不安全。
-
JAVA代码实现:
public class Singleton {// 私有静态变量,用于存储单例实例private static Singleton instance;// 私有构造方法,防止外部直接创建实例private Singleton() {}// 公有静态方法,用于获取单例实例public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
-
懒汉式(线程安全) 在懒汉式的基础上,通过同步方法保证线程安全。缺点是效率较低。 JAVA代码实现:
public class Singleton {private static Singleton instance;private Singleton() {}// 同步方法,保证线程安全public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
-
饿汉式 饿汉式单例模式在类加载时就完成了初始化,保证了线程安全。缺点是类加载时就初始化,可能会浪费资源。 JAVA代码实现:
public class Singleton {// 私有静态变量,类加载时初始化private static Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
-
双重校验锁 双重校验锁单例模式在懒汉式的基础上,通过双重校验锁保证线程安全,同时提高效率。 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;}
}
-
静态内部类 静态内部类单例模式利用静态内部类的特性,实现懒加载和线程安全。 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;}
}
-
枚举 枚举单例模式利用枚举的特性,实现单例,且自动支持序列化机制,防止反射攻击。 JAVA代码实现:
public enum Singleton {// 枚举元素,本身就是单例INSTANCE;// 公有方法,可以添加其他业务方法public void doSomething() {// 业务逻辑}
}
四、总结
单例模式是一种简单且常用的设计模式,适用于需要确保一个类只有一个实例的场景。在实际开发中,应根据具体需求选择合适的实现方式。