返回
在任何时候,只存在一个你:六种单例模式的精彩实现
后端
2023-09-28 18:14:24
单例模式的六种写法
饿汉式
饿汉式是最简单的单例模式实现,在类加载时就创建实例,并将其存储在私有静态变量中。这种方式的好处是线程安全,因为实例在类加载时就创建好了,不会出现多线程同时创建多个实例的情况。但是,饿汉式也存在一个缺点,就是无论是否需要使用这个实例,它都会在类加载时创建,这可能会造成资源浪费。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
懒汉式(线程不安全)
懒汉式在需要使用实例时才创建实例,这可以节省资源。但是,懒汉式存在一个问题,就是多线程同时访问时可能会创建多个实例。为了解决这个问题,可以在创建实例的方法上加锁,但这样会影响性能。
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
懒汉式(上锁,线程安全)
懒汉式(上锁,线程安全)在创建实例的方法上加锁,可以保证多线程同时访问时只创建一个实例。这种方式解决了懒汉式(线程不安全)的问题,但同时也牺牲了性能。
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
懒汉式(双重校验锁,线程安全)
懒汉式(双重校验锁,线程安全)是一种优化后的懒汉式实现,它使用了两次检查来确保只有一个实例被创建。这种方式既保证了线程安全,又提高了性能。
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
静态内部类(线程安全)
静态内部类是一种巧妙的实现单例模式的方法。它将实例创建放在一个静态内部类中,当这个静态内部类被加载时,才会创建实例。这种方式既保证了线程安全,又提高了性能。
public class Singleton {
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
枚举(线程安全)
枚举也是一种实现单例模式的好方法。枚举是 Java 中的一种特殊类型,它可以包含一组常量。枚举是线程安全的,因为它们在编译时就已经被创建好了。
public enum Singleton {
INSTANCE;
public static Singleton getInstance() {
return INSTANCE;
}
}
结语
单例模式是一种非常重要的设计模式,它可以确保某个类只有一个实例存在,并且可以被全局访问。本文介绍了六种单例模式的实现,分别是饿汉式、懒汉式(线程不安全)、懒汉式(上锁,线程安全)、懒汉式(双重校验锁,线程安全)、静态内部类(线程安全)和枚举(线程安全)。每种实现方式都有其优缺点,开发者可以根据自己的需要选择合适的实现方式。