掌握单例模式的五种高级实现:手撕单例的精华技巧
单例模式是软件工程中常用的一种设计模式,其主要目的是确保某个类只有一个实例,并提供一个全局访问点来获取该实例。在许多情况下,比如数据库连接、线程池、配置对象等,单例模式都非常有用。然而,要正确实现单例模式并非易事,特别是在多线程环境下。本文将深入探讨单例模式的五种高级实现方式,帮助您掌握手撕单例的精华技巧。
1. 懒汉式单例(线程不安全)
懒汉式单例是最简单的单例实现方式,其特点是实例在第一次使用时才进行创建。这种方式的优点是延迟加载,但缺点是在多线程环境下会出现线程安全问题。
“`java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {if (instance == null) {instance = new Singleton();
}
return instance;
}
}
“`
2. 懒汉式单例(线程安全)
为了解决懒汉式单例在多线程环境下的线程安全问题,我们可以对 getInstance()
方法加锁。这样可以确保在多线程环境下,只有一个线程能够创建实例。
“`java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();
}
return instance;
}
}
“`
3. 饿汉式单例
饿汉式单例与懒汉式单例相反,它在类加载时就进行了实例化。这种方式简单且线程安全,但缺点是如果实例从未被使用,则会造成资源浪费。
“`java
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {return instance;}
}
“`
4. 双重校验锁单例
双重校验锁单例是懒汉式单例的改进版本,它在 getInstance()
方法中使用了双重校验锁,既保证了线程安全,又提高了性能。
“`java
public class Singleton {
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;
}
}
“`
5. 静态内部类单例
静态内部类单例是利用静态内部类的特性来实现单例的一种方式。这种方式既实现了懒加载,又保证了线程安全。
“`java
public class Singleton {
private Singleton() {}
private static class Holder {private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {return Holder.INSTANCE;}
}
“`
总结
单例模式虽然简单,但要实现一个既线程安全又性能高效的单例并非易事。本文介绍了五种单例模式的高级实现方式,包括懒汉式、饿汉式、双重校验锁、静态内部类等。每种方式都有其优缺点,适用于不同的场景。在实际开发中,应根据具体需求选择合适的单例实现方式。