单例模式的特点
- 单例模式只能有一个实例。
- 单例类必须创建自己的唯一实例。
- 单例类必须向其他对象提供这一实例
应用场景
某个对象频繁被访问使用
主要有五种实现方式,懒汉式(延迟加载,使用时初始化),饿汉式(声明时初始化),双重检查,静态内部类,枚举
实现要点
声明为private来隐藏构造器
private static Singleton实例
声明为public来暴露实例获取方法
1.懒汉式,线程不安全的实现
private static Singleton instance;
private Singleton() {
};
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
//由于没有同步,多个线程可能同时检测到实例没有初始化而分别初始化,从而破坏单例约束
懒汉式,线程安全但效率低下的实现
public class Singleton {
private static Singleton instance;
private Singleton() {
};
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
//由于对象只需要在初次初始化时需要同步,多数情况下不需要互斥的获得对象,加锁会造成巨大无意义的资源消耗
2.饿汉式
instance在类加载时进行初始化,避免了同步问题。饿汉式的优势在于实现简单,劣势在于不是懒加载模式(lazy initialization)在需要实例之前就完成了初始化,在单例较多的情况下,会造成内存占用,加载速度慢问题 由于在调用getInstance()之前就完成了初始化,如果需要给getInstance()函数传入参数,将会无法实现
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {
};
public static Singleton getInstance() {
return instance;
}
}
3.双重检查锁定(double checked locking pattern)
public class Singleton {
private static Singleton instance=null;
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 Singleton() {
};
public static Singleton getInstance() {
return Holder.instance;
}
private static class Holder{
private static Singleton instance = new Singleton();
}
}
5.枚举
网友评论