您的位置:首页 > 运维架构 > 网站架构

移动架构08_单例模式

2017-10-01 17:03 429 查看
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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息