首页 > 代码库 > java设计模式---单例模式

java设计模式---单例模式

1. 饿汉模式
public class SingleInstance {
private static final SingleIntance mInstance = new SingleIntance();

private SingleIntance(){
}

public static SingleInstance(){
return mInstance;
}
}

这种方式在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。
这种方式基于类加载机制避免了多线程的同步问题,但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,
这时候初始化instance显然没有达到懒加载的效果。

2. 懒汉模式
public class SingleInstance {
private static SingleInstance mInstance;

private SingleInstance(){
}

public static synchronized SingleInstance getInstance(){
if(mInstance == null){
mInstance = new SingleInstance();
}
return mInstance;
}
}
这种写法能够在多线程中很好的工作,但是每次调用getInstance方法时都需要进行同步,造成不必要的同步开销,
而且大部分时候我们是用不到同步的,所以不建议用这种模式。

3. DCL模式(基于volatile的双重检查锁double-checked-locking), 据说会出现DCL失效问题:编译时和运行时CPU指令重排等
public class SingleInstance{
private volatile static SingleInstance mInstance;

private SingleInstance(){
}

public static SingleInstance getInstance(){
if(mInstance == null){
synchronized(SingleInstance){
if(mInstance == null){
mInstance = new SingleInstance();
}
}
}
return mInstance;
}
}
这种写法在getSingleton方法中对singleton进行了两次判空,第一次是为了不必要的同步,第二次是在singleton等于null的情况下才创建实例。
在这里用到了volatile关键字,在这里使用volatile会或多或少的影响性能,但考虑到程序的正确性,牺牲这点性能还是值得的。
DCL优点是资源利用率高,第一次执行getInstance时单例对象才被实例化,效率高。缺点是第一次加载时反应稍慢一些,
在高并发环境下也有一定的缺陷,虽然发生的概率很小。

4. 静态内部类单例模式
public class Singleton {

private Singleton() {}

public static Singleton getInstance() {
return SingletonHolder.mInstance;
}

private static class SingletonHolder {
private static final Singleton mInstance = new Singleton();
}

}
第一次加载Singleton类时并不会初始化sInstance,只有第一次调用getInstance方法时虚拟机加载SingletonHolder 并初始化sInstance ,
这样不仅能确保线程安全也能保证Singleton类的唯一性,所以推荐使用静态内部类单例模式。
5. 枚举单例
public enum Singleton {
INSTANCE;


public void doSomeThing() {
}
}
使用Singleton.INSTANCE;
默认枚举实例的创建是线程安全的,并且在任何情况下都是单例

java设计模式---单例模式