2024年1月13日发(作者:)
单例模式的8种写法
单例模式是一种常用的设计模式,在软件开发中经常被使用。它的主要目的是确保一个类只有一个实例,并且提供一个全局访问点。
在实际应用中,单例模式的使用非常广泛。比如,在某个系统中,只允许创建一个日志文件、数据库连接池等。这些场景下,单例模式可以确保只有一个实例存在,避免资源的浪费和冲突。
单例模式的实现方式有多种,下面将详细介绍8种常见的实现方法。
1. 饿汉式(直接初始化):
java
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
这种方式在类加载时就创建了一个实例,因此线程安全,但可能存在资源浪费的问题,因为即使不使用也会创建实例。
2. 饿汉式(静态代码块初始化):
java
public class Singleton {
private static final Singleton INSTANCE;
static {
INSTANCE = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
与第一种方式相似,只是将实例创建的过程放在了静态代码块中。
3. 懒汉式(线程不安全):
java
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
这种方式实现了懒加载,只有在第一次调用getInstance方法时才会创建实例。但是这种方式在多线程环境下是不安全的,可能会创建多个实例。
4. 懒汉式(线程安全,加锁):
java
public class Singleton {
private static Singleton INSTANCE;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
为了避免在多线程环境下创建多个实例,可以使用synchronized关键字加锁,确保只有一个线程可以创建实例。但是这种方式效率较低,每次调用getInstance方法都需要进行同步,即使实例已经创建了。
5. 懒汉式(线程安全,双重检查):
java
public class Singleton {
private static volatile Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
synchronized () {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}
通过双重检查,既保证了线程安全性,又避免了每次调用getInstance方法都进行同步的问题。关键在于使用volatile关键字修饰INSTANCE变量,禁止指令重排序,确保先分配内存、再初始化对象、最后将INSTANCE指向该对象。
6. 懒汉式(线程安全,静态内部类):
java
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return CE;
}
}
通过静态内部类来实现懒加载,当getInstance方法被调用时,才会初始化SingletonHolder类,从而创建实例。这种方式能够保证线程安全性。
7. 枚举单例:
java
public enum Singleton {
INSTANCE;
}
枚举是一种特殊的类,它的实例是有限且唯一的。枚举单例可以保证线程安全,同时也能防止反射和反序列化创建新的实例。
8. 使用容器实现单例:
java
public class SingletonManager {
private static Map
HashMap<>();
private SingletonManager() {}
public static void registerService(String key, Object instance) {
if (!nsKey(key)) {
(key, instance);
}
}
public static Object getService(String key) {
return (key);
}
}
通过容器管理单例,可以将多个实例存放在一个容器中,需要时通过key值获取对应的实例。这种方式可以灵活管理单例对象的创建和获取。
以上是8种常见的单例模式的实现方式,每种方式都有其适用的场景和特点。在具体开发中,根据需求和性能要求选择合适的单例模式实现方式,从而确保系统的正确性和高效性。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1705128501a1394829.html
评论列表(0条)