美文网首页
4、单例模式

4、单例模式

作者: lois想当大佬 | 来源:发表于2019-12-16 15:10 被阅读0次

一、单例模式-饿汉模式
1、定义一个不可变的静态变量并直接实例化
2、构造函数私有化
3、定义一个静态函数总是返回实例

package com.hello.single;

/**
 * 单例模式-饿汉模式
 * 1、定义一个不可变的静态变量并直接实例化
 * 2、构造函数私有化
 * 3、定义一个静态函数总是返回实例
 *
 * 问题:
 * 1、EhanSingle类在加载字节码到虚拟机的时候就会实例化这个实例,
 * 在你没有使用该单例的时候,该单例却被加载了,如果该单例很大的话,将会浪费很多的内存
 */
public class EhanSingle {

    private static final EhanSingle single = new EhanSingle();

    private EhanSingle(){}

    public static EhanSingle getInstance() {
        return single;
    }
}

存在问题:
1、EhanSingle类在加载字节码到虚拟机的时候就会实例化这个实例,在你没有使用该单例的时候,该单例却被加载了,如果该单例很大的话,将会浪费很多的内存。

二、单例模式-懒汉模式
1、定义一个静态变量实例
2、定义一个静态函数创建并返回实例
3、私有化构造函数

package com.hello.single;

/**
 * 单例模式-懒汉模式
 * 1、定义一个静态变量实例
 * 2、定义一个静态函数创建并返回实例
 * 3、私有化构造函数
 * 问题
 * 1、多线程环境下不能保证单例
 */
public class LanhanSingle1 {


    private static LanhanSingle1 single;

    private LanhanSingle1(){};

    public static LanhanSingle1 getInstance() {
        // 如果对象不是null,就直接返回实例,从而保证单例。也可以保证不浪费内存(不调用则不产生对象)
        if (single == null) {
            single = new LanhanSingle1();
        }
        return single;
    }
}

存在问题:
1、多线程环境下不能保证单例

三、单例模式-懒汉模式-加锁
1、定义一个静态变量实例
2、定义一个静态函数创建并返回实例
3、私有化构造函数
4、同步锁确保在多线程环境下保证单例

package com.hello.single;

/**
 * 单例模式-懒汉模式
 * 1、定义一个静态变量实例
 * 2、定义一个静态函数创建并返回实例
 * 3、私有化构造函数
 * 4、同步锁确保在多线程环境下保证单例
 * 问题
 * 1、正确的对象实例化流程:
 * a、在堆空间分配内存
 * b、执行构造方法进行初始化
 * c、将对象指向内存中分配的内存空间,也就是地址
 * 2、但是,由于编译器会对代码进行重排序优化,如果执行的顺序是acb,则也会产生错误对象。
 */
public class SynLanhanSingle2 {


    private static SynLanhanSingle2 single;

    private SynLanhanSingle2(){};

    public static SynLanhanSingle2 getInstance() {
        // 多线程访问,不做控制、不影响性能
        if (single == null) {
            // 此时,如果多个线程进入,则进入同步块
            synchronized (SynLanhanSingle2.class) {
                // 此时,第一个进入的线程判断为null,但是第二个线程进来时已经不是null了
                if (single == null) {
                    single = new SynLanhanSingle2();
                }
            }
        }
        // 如果不为null,不会影响性能,只有第一次才会影响性能
        return single;
    }
}

四、 单例模式-懒汉模式-静态内部类
1、静态内部类实例化对象
2、定义一个静态函数返回实例
3、私有化构造函数

package com.hello.single;

/**
 * 单例模式-懒汉模式
 * 1、静态内部类实例化对象
 * 2、定义一个静态函数返回实例
 * 3、私有化构造函数
 * 问题:
 * 1、反射破坏
 * 2、反序列化破坏
 */
public class InnerLanhanSingle3 {

    private InnerLanhanSingle3(){};

    public static InnerLanhanSingle3 getInstance() {
        return InnerClass.single;
    }

    /**
     * 静态内部类的虚拟机机制,只有当访问类的时候,才会加载,
     * 因此, 既保证了懒加载(节省内存),又保证了单例与线程安全。
     */
    private static class InnerClass{
        private static final InnerLanhanSingle3 single = new InnerLanhanSingle3();
    }
}

上一篇:模板方法模式

相关文章

  • 设计模式之一:单例模式

    摘要:设计模式之一:单例模式目录介绍1.单例模式介绍2.单例模式定义3.单例模式使用场景4.单例模式的实现方式 4...

  • 单例模式和GCD单例实现

    1、传统单例模式2、GCD单例模式3、用宏实现GCD单例模式4、用宏实现GCD单例模式,名称随类名变化而变化 单例...

  • 单例模式

    单例模式及C++实现代码单例模式4种实现详解 c++11改进我们的模式之改进单例模式 单例模式(Singleton...

  • 单例模式

    目录 1、设计模式简介 2、什么是单例模式 3、单例模式应用场合 4、单例模式作用 5、单例模式3个要点/要素 6...

  • 设计模式第二篇、单例设计模式

    目录1、什么是单例设计模式2、单例设计模式的简单实现3、单例设计模式面临的两个问题及其完整实现4、单例设计模式的应...

  • 第4章单例模式

    第4章单例模式 4.1 实现单例模式 或者 意义不大 4.2 透明的单例模式 构造函数很奇怪 让这一单例类变成一个...

  • kotlin实现单例模式

    1.懒汉式实现单例模式 2.线程安全懒汉式实现单例模式 3.双重校验懒汉式实现单例模式 4.静态内部类方式实现单例模式

  • Android设计模式(单例模式)

    目录 1.单例模式简介 2.单例模式关键点 3.单例模式UML图 4.单例模式的实现方式饿汉式懒汉式同步锁懒汉式D...

  • C# 单例

    Unity 单例模式[https://www.jianshu.com/p/97e4758ff4b4] 单例模式在开...

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

网友评论

      本文标题:4、单例模式

      本文链接:https://www.haomeiwen.com/subject/bwcdnctx.html