单例模式是设计模式中的一种,它确保一个类只有一个实例,并提供一个全局访问点。在多线程环境下,单例模式需要特别考虑线程安全问题。本文将详细介绍五种线程安全的单例模式实现方法,帮助您告别并发烦恼。
1. 饿汉式单例
饿汉式单例是在类加载时就完成了实例化。这种方式简单直接,但可能会占用不必要的内存。
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
这种方式线程安全,但可能导致类加载时就占用了内存。
2. 懒汉式单例
懒汉式单例是在第一次使用时才进行实例化。这种方式可以节省内存,但可能会在多线程环境下出现问题。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这种方式线程安全,但每次调用getInstance()方法时都需要进行同步,影响性能。
3. 双重校验锁单例
双重校验锁单例利用了volatile关键字保证变量的可见性和有序性,避免了同步带来的性能损耗。
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;
}
}
这种方式线程安全,且性能较高。
4. 静态内部类单例
静态内部类单例利用了类加载机制保证线程安全,无需同步。
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
这种方式线程安全,且性能较高。
5. 枚举单例
枚举单例是一种最简单、最安全、最灵活的方式实现单例。
public enum Singleton {
INSTANCE;
public void whateverMethod() {
// 实现方法
}
}
这种方式线程安全,且具有防止反射攻击的特性。
总结
本文介绍了五种线程安全的单例模式实现方法,包括饿汉式、懒汉式、双重校验锁、静态内部类和枚举单例。在实际开发中,您可以根据项目需求选择合适的单例模式。
