多线程单例模式
Posted 写Bug的渣渣高
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程单例模式相关的知识,希望对你有一定的参考价值。
//延迟加载
//对方法使用synchronized之后,使用多线程debug也是无法进入getInstance方法
class LazySingleton
private static LazySingleton instance;
// 第一版,在多线程的情况下会有问题,两个获得的实例不一样
// public LazySingleton getInstance()
// if (instance==null)
// instance=new LazySingleton();
//
// return instance;
//
// 给整个方法加上锁,但是对性能影响比较大
// 使用多线程debug
// public synchronized LazySingleton getInstance()
// if (instance==null)
// instance=new LazySingleton();
//
// return instance;
//
//DoubleCheck
//仍有风险,在第一个if和第二个if内部语句
//可能会存在,第一个if判断为真,因为此时instance没有创建好对象
//加一个 volatile 在 static 前
public LazySingleton getInstance()
if (instance==null)
synchronized (LazySingleton.class)
if (instance==null)
instance=new LazySingleton();
// 1.分配内存 2. 初始化对象 3.设置instance指向内存空间 2 3 顺序可能有变化
///2 和 3 重排序
return instance;
// 在创建的时候,就已经初始化了
// 所以是可以在构造器里面判断是否为空
class HungrySingleton
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton()
// 当强制使用反射来构造的时候,也无法构造出另一个类
if (instance!=null)
throw new RuntimeException("单例不允许多个实例");
public static HungrySingleton getInstance()
return instance;
静态内部类的单例模式:需要JVM知识
class InnerClassSingleton
private static class InnerClassHolder
private static InnerClassSingleton instance=new InnerClassSingleton();
private InnerClassSingleton()
if (InnerClassHolder.instance!=null)
throw new RuntimeException("单例不允许多个实例");
public static InnerClassSingleton getInstance()
return InnerClassHolder.instance;
以上是关于多线程单例模式的主要内容,如果未能解决你的问题,请参考以下文章