一、单例模式
单例模式是一种常见的创建型设计模式,它确保一个类仅仅只有一个实例,并且提供了一个全局访问点来访问该实例。
以下是几种常见的单例模式的实现方式:
1.1 饿汉式(Eager Initialization)
饿汉式单例在类加载时就创建实例对象,并在静态变量中保存。这种方式在多线程环境下是线程安全的,但可能会浪费内存,因为无论是否使用该实例都会创建。
【示例:饿汉式单例模式】
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
1.2 懒汉式(Lazy Initialization)
懒汉式单例在第一次使用时才创建实例对象。这种方式在多线程环境下需要考虑线程安全性,存在线程安全问题,需要加锁来解决。
【示例:懒汉式单例模式】
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
public synchronized static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
1.3 双重检查锁定(Double-Checked Locking)
双重校验锁式单例是一种优化懒汉式单例的方式,在懒汉式的基础上进行改进,通过双重检查加锁来提高性能,可以避免重复创建实例对象、保证线程安全性。
【示例:双重检查锁定-优化饿汉式单例模式】
public class Singleton {
private volatile static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronized (Singleton.class){
if(instance == null){
instance = newSingleton();
}
}
}
return instance;
}
}
1.4 静态内部类(Static Inner Class)
静态内部类式单例是一种优雅的写法,它利用了 Java 对类的加载机制,主要利用了类的静态内部类特性,在需要时才加载并创建实例。这种方式在多线程环境下是线程安全的,可以保证线程安全、延迟加载、高效性。
【示例:静态内部类单例模式】
public class Singleton {
private Singleton(){}
private static class SingletonHolder{
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
}