移动架构08_单例模式

来源:互联网 发布:2015十大网络神曲视频 编辑:程序博客网 时间:2024/05/22 05:22
Demo:http://download.csdn.net/download/baopengjian/10005006
一、饿汉模式:
 第一步加载class文件就已经实例化了
缺点:没有做到想用时才实例化

public class SingleEasy {
private static SingleEasy singleEasy = new SingleEasy();
public static SingleEasy getInstance(){
return singleEasy;
}
}

二、懒汉模式:
每次调用getInstance时 都需要进行同步开销

public class SingleNotEmptyEasy {
private static SingleNotEmptyEasy iEasy;
public static synchronized SingleNotEmptyEasy getInstance(){
if(iEasy == null){
iEasy = new SingleNotEmptyEasy();
}
return iEasy;
}

}


三、DCL单例模式
缺点:高并发时,也会产生创建不止一个对象。
原因:class文件中方法的字节码流就是由JVM的指令序列构成的
Jdk5 以后支持处理器乱序执行 汇编指令
导致 指向地址和实例化堆区 顺序不同
  public class DCLSingle {

private static DCLSingle single;
public DCLSingle getInstance(){
if(single == null){
synchronized (DCLSingle.class) {
if(single == null){
single = new DCLSingle();
}
}
}
return single;
}


 四、枚举:
public enum EnumManger {

SDCardManager(10)
{
@Override
public EnumManger getSingle() {
return SDCardManager;
}

}
,
HttpManager(1) {
@Override
public EnumManger getSingle() {
return HttpManager;
}
};
private int type;
public abstract EnumManger getSingle();
private EnumManger(int type)
{
this.type = type;
}

}


注意:
1 枚举中的属性必须放在最前面 
2. 枚举中可以和java类一样定义方法
3. 枚举中的构造方法必须是私有的

五、登记式/静态内部类

是否多线程安全:是

描述:这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。

代码实例:
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}