浅析单例模式的几种实现方式
单例模式的几个必要点:
1.构造函数不对外开放,修饰符为private
2.通过静态方法返回单例对象
3.确保类对象有且只有一个,尤其在多线程下
4.确保类对象在反序列化时不会重新构建对象
饿汉模式:
主要通过static final 来保证类对象只有一个
懒汉模式:
public class LanHan(){
private Lanhan lanHan;
private LanHan(){}
public static synchronized LanHan getInstance(){
if(lanHan==null){
lanHan=new LanHan();
}
return lanHan;
}
}
缺点:第一次加载需要时间进行实例化 问题:每次getInstance需要做同步锁操作
Double Check Lock:
public class DCL(){
private volatile static DCL dcl=null;
private DCL(){}
public static LanHan getInstance(){
if(dcl==null){
synchronized(DCL.class){
if(dcl==null){
dcl=new DCL();
}
}
return lanHan;
}
}
第一次判空,是为了有类实例时不做同步锁操作。 第二次判空,是判断对象为空时才去实例化。加volatile确保是每次对象是从主内存读取,防止对象还没初始化完全就被另外线程取走。
静态内部类单例模式:
public class SingleTon {
private SingleTon(){}
public static getInstance(){
return SingleTonHolder.instance;
}
private static class SingleTonHolder{
private static final SingleTon instance=new SingleTon();
}
}
静态内部类只会在第一次getInstance时去加载内部类,且只会加载一次
还有通过枚举和容器构造单例,用的不多,就不写了。
单例的优缺点:单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。
但是单例模式没有接口,扩展很困难。特别要注意单例对象如果持有Context,那么容易引发内存泄漏,此时需要注意传递给单例对象的context,最好是Application Contex

浙公网安备 33010602011771号