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;
}
}
注意:
- 枚举中的属性必须放在最前面
- 枚举中可以和java类一样定义方法
- 枚举中的构造方法必须是私有的
五、登记式/静态内部类
是否多线程安全:是
描述:这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。
代码实例:
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}