Java设计模式单例模式(Singleton)用法解析_java

懒汉式(线程不安全)

当多个访问者同时访问的时候很有可能创建多个对象。之所以叫懒汉式,是因为这种写法是使用的时候才创建,起到了懒加载Lazy loading的作用,实际开发中不建议采用这种写法

public class LazySingleton {

private static LazySingleton instance;

private LazySingleton(){

}

public static LazySingleton getInstance(){
if( instance!=null ){
instance = new LazySingleton();
}

return instance;
}

}

线程安全的懒汉式(线程安全)

public class LazySingleton {

private static LazySingleton instance;

private LazySingleton(){

}

public synchronized static LazySingleton getInstance(){
if( instance!=null ){
instance = new LazySingleton();
}

return instance;
}

}

饿汉式(线程安全)

直接在运行(加载)这个类的时候创建了对象,之后直接访问。显然这种方式没有起到Lazy loading的效果。但是是线程安全的,实际开发中还是比较常用。

public class HungrySigleton {

public static final HungrySigleton instance = new HungrySigleton();

private HungrySigleton(){}

public static HungrySigleton getInstance(){
return instance;
}

}

静态内部类(线程安全)

public class StaticInnerClassSingleton {

//构造方法私有化
private StaticInnerClassSingleton(){};

private static class HolderInnerClass {
//需要提供单例对象的外部类作为静态属性加载的时候就初始化
private static StaticInnerClassSingleton instance = new StaticInnerClassSingleton();
}

//对外暴漏访问点
public static StaticInnerClassSingleton getInstance(){
return HolderInnerClass.instance;
}

}

枚举方法单例(线程安全)

暂时空

双重检查法(通常线程安全、低概率线程不安全)

public class DoubleCheckSingleton {

private static DoubleCheckSingleton instance;

private DoubleCheckSingleton(){};

public static DoubleCheckSingleton getInstance(){

if( instance == null ){
synchronized (DoubleCheckSingleton.class){
if( instance == null ){
instance = new DoubleCheckSingleton();
}
}
}

return instance;
}

}

Double check(volatile) 双重检查法-升级版

volatile关键字的其中一个作用就是禁止指令重排序,把instance声明volatile后,对它的操作就会有一个内存屏障

public class DoubleCheckSingleton {

private volatile static DoubleCheckSingleton instance;

private DoubleCheckSingleton(){};

public static DoubleCheckSingleton getInstance(){

if( instance == null ){
synchronized (DoubleCheckSingleton.class){
if( instance == null ){
instance = new DoubleCheckSingleton();
}
}
}

return instance;
}

}

ThreadLocal实现单例模式(线程安全)

public class ThreadLocalSingleton {

private static final ThreadLocal<ThreadLocalSingleton> threadLocal = new ThreadLocal (){
@Override
protected ThreadLocalSingleton initialValue() {
return new ThreadLocalSingleton();
}
};

private ThreadLocalSingleton(){};

public static ThreadLocalSingleton getInstance(){
return threadLocal.get();
}
}