单例模式(Singleton Pattern)是一种常用的软件设计模式,其目的是确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。在Java中,实现单例模式有多种方式,但主要可以归纳为以下几种:
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()
方法上添加synchronized
关键字,使其在多线程环境下安全,但效率较低。
java复制代码
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3. 双重检查锁定(Double-Checked Locking)
这种方式既保证了线程安全,又比单纯的同步方法效率要高。
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;
}
}
注意,这里instance
变量被声明为volatile
,这是为了防止指令重排序。
4. 静态内部类
这种方式利用了classloder的机制来保证初始化instance时只有一个线程,既实现了线程安全,又避免了同步带来的性能影响。
java复制代码
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
5. 枚举
这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化,即使在面对复杂的序列化或者反射的时候,这种实现方式仍然有效。
java复制代码
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
总结
- 懒汉式(线程不安全)和懒汉式(线程安全)实现简单,但前者在多线程环境下不安全,后者虽然安全但效率较低。
- 双重检查锁定方式既保证了线程安全,又提高了效率,但实现较为复杂。
- 静态内部类方式利用了classloder机制,既实现了线程安全,又避免了同步的开销。
- 枚举方式是实现单例模式的最佳方法,它更简洁,更安全。