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(); } }
|