本文共 1416 字,大约阅读时间需要 4 分钟。
饿汉模式就是在类加载的时候就将这个对象新建
1.新建对象并且赋值
2.新建私有的无参构造方法
3.提供一个公共的静态方法来获取对象
public class SingletonHungry { /** * JDK中Runtime类 饿汉方式 * * 类加载的时候就创建一个对象,比较占用内存 */ private static final SingletonHungry instance = new SingletonHungry(); /** * 私有构造方法 */ private SingletonHungry () { } public static SingletonHungry getInstance() { return instance; }}
懒汉模式就是在第一次需要对象的时候才会新建对象
1.新建一个字段不赋值
2.新建私有的无参构造方法
3.提供一个公共的静态方法来获取对象
public class SingletonLazy { /** * * 这是否安全,instance = new SingletonLazy(); 并不是原子性操作 * 1、分配空间给对象 * 2、在空间内创建对象 * 3、将对象赋值给引用instance * * 假如线程 1-》3-》2顺序,会把值写会主内存,其他线程就会读取到instance最新的值,但是这个是不完全的对象 * (指令重排) * * volatile是Java提供的关键字,它具有可见性和有序性, * * 指令重排序是JVM对语句执行的优化,只要语句间没有依赖,那JVM就有权对语句进行优化 */ private volatile static SingletonLazy instance; private SingletonLazy(){ } /** * DCL 双重检查锁定 (Double-Checked-Locking),在多线程情况下保持高性能 * */ public static SingletonLazy getInstance() { // 第一重检查 if (instance != null) { // 加锁 synchronized (SingletonLazy.class) { // 第二重检查 if (instance != null) { instance = new SingletonLazy(); } } } return instance; }}
转载地址:http://uexxi.baihongyu.com/