介绍
单例模式确保某一个类只有一个实例,而且自行实例化。
主要解决:一个全局使用的类频繁地创建与销毁。
使用场景:需要控制实例数目并且节省系统资源的时候。
优点:
- 内存中只有一个实例,减少内存开销(在频繁创建销毁实例的程序中得到很好的应用)
- 避免对资源的多重占用
UML类图
- Main:客户端
- SingleObject: 单例类
实现单例模式关键点:
- 构造函数私有
- 确保单例类对象有且仅有一个,尤其是在多线程环境下
代码实现
以下实现均线程安全。
饿汉式
`public class SingleObject {
private static SingleObject instance = new SingleObject();
private SingleObject() {}
public static SingleObject getInstance() {
return instance;
}
}
优点:没有加锁,效率会提高
缺点:类加载时就初始化,浪费内存;
懒汉式
public class SingleObject {
private static SingleObject instance;
private SingleObject() {}
public static synchronized SingleObject getInstance() {
if (instance == null) {
instance = new SingleObject();
}
return instance;
}
}
优点:懒汉模式在第一次调用才初始化,避免了内存浪费。
缺点:使用synchronized关键字添加了方法锁,每次调用getInstance()方法都会进行同步,降低了效率;
DCL(Double Check Lock)
public class SingleObject {
private static SingleObject instance;
private SingleObject() {}
public static SingleObject getInstance() {
if (instance == null) {
synchronized (SingleObject.class) {
if (instance == null) {
instance = new SingleObject();
}
}
}
return instance;
}
}
优点:能够在需要时才初始化单例;线程安全且初始化后再调用getInstance()方法不进行同步锁。
缺点:第一次加载时稍慢。
静态内部类
public class SingleObject {
private SingleObject() {}
public static SingleObject getInstance() {
return SingleHolder.sIntance;
}
private static class SingleHolder {
private static final SingleObject sIntance = new SingleObject();
}
}
只有再第一次调用getInstance()方法时才会导致sIntance被初始化。
原理:利用classloader机制来保证初始化instance只有一个线程。
枚举
public enum SingleObject {
INSTANCE;
public void method() {}
}
枚举实例的创建线程安全的,并且即使反序列化也不会重新生成新的实例。
网友评论