Java设计模式-单例模式实现方法详解
什么是单例模式
单例模式是一种常用的软件设计模式,其定义是确保一个类只有一个实例,且自行实例化并向整个系统提供这个实例。在Java中,单例模式在一些场景下非常有用,例如配置文件、日志输出、线程池等等。
实现单例模式的方法
1. 懒汉式单例模式
懒汉式单例模式是指在第一次调用getInstance方法时才实例化单例对象。这种方式适用于单例对象的创建比较耗费资源的情况,可以避免不必要的资源浪费。
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
2. 饿汉式单例模式
饿汉式单例模式是指在类加载时就将单例对象实例化成员。这种方式可以保证线程安全,但可能会浪费不必要的资源。
public class EagerSingleton {
private static EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return instance;
}
}
3. 双重检查锁定单例模式
双重检查锁定单例模式是指在getInstance方法中进行两次检查来确保单例对象的创建并保证线程安全。这种方式既能够避免不必要的资源浪费,又能保证线程安全。
public class DoubleCheckLockSingleton {
private static volatile DoubleCheckLockSingleton instance;
private DoubleCheckLockSingleton() {}
public static DoubleCheckLockSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckLockSingleton.class) {
if (instance == null) {
instance = new DoubleCheckLockSingleton();
}
}
}
return instance;
}
}
如何选择单例模式的实现方法
- 如果单例对象的创建比较耗费资源,可以通过懒汉式单例模式来实现;
- 如果希望保证线程安全,并且单例对象的创建不会耗费太多资源,可以使用饿汉式单例模式;
- 如果希望即能保证线程安全,又能够避免不必要的资源浪费,可以使用双重检查锁定单例模式。
实例说明
以下两个示例对比展示了懒汉式单例模式和饿汉式单例模式的区别:
// 懒汉式单例模式
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
// 饿汉式单例模式
public class EagerSingleton {
private static EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return instance;
}
}
在单线程环境下,两者实现单例对象的方式是一样的。但在多线程环境下,懒汉式单例模式会存在线程安全问题,需要在getInstance方法上添加synchronized关键字。
所以,如果单例对象的创建比较耗费资源,可以考虑使用懒汉式单例模式,并在getInstance方法上添加synchronized关键字保证线程安全;如果单例对象的创建比较简单,不会耗费太多资源,则可以使用饿汉式单例模式,避免不必要的同步。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java设计模式-单例模式实现方法详解 - Python技术站