美文网首页
设计模式——单例模式

设计模式——单例模式

作者: NLper小白 | 来源:发表于2021-12-01 09:40 被阅读0次

单例模式


在当前进程中,通过单例模式创建的类有且只有一个实例。
特点:
1. 保证在一个JVM中,该对象只有一个实例存在
2. 构造器必须是私有的,外部类无法通过调用构造器方法创建该实例
3. 没有公开的set方法,外部类无法调用set方法创建该实例
4. 提供一个公开的get方法获取唯一的这个实例
优点:
1. 减少系统开销,减低内存使用频率
2. 避免对资源的重复占用

饿汉模式

把对象提前实例化,外部第一次获取这个类的对象时就直接存在这个类,省去创建的开销
//饿汉模式
class HungrySingleton{
    //1.私有构造函数,保证不能实例化本类
    private HungrySingleton(){}
    //2. 创建一个类的实例化对象
    private static HungrySingleton hungrySingleton = new HungrySingleton();
    //3. 创建一个get方法,返回一个实例
    public static HungrySingleton getInstance(){
        return hungrySingleton;
    }
}

懒汉模式

对象没有被提前实例化,外部第一次获取这个类的对象时是空的,需要初始化,赋值

线程不安全的模式

多个线程调用getInstance方法来获取Singleton的实例是,可能会导致实例化了两个对象
// 懒汉模式
class LazySingleton{
    //1.私有构造函数,保证不能实例化本类
    private LazySingleton(){}
    //2. 自己创建一个类的实例化 
    private  static LazySingleton singleton;
    //3. 创建一个get方法,返回实例
    public static LazySingleton getInstance(){
        //判断singleton是否为null,如果为null,即判定需要实例化
        if (singleton == null) {
            singleton= new LazySingleton();
        }
        return singleton;
    }
}

线程安全模式

// 懒汉模式
class LazySingleton{
    //1.私有构造函数,保证不能实例化本类
    private LazySingleton(){}
    //2. 自己创建一个类的实例化 (volatile保证不会发生重排序)
    private volatile static LazySingleton singleton;
    //3. 创建一个get方法,返回实例
    public static LazySingleton getInstance(){
        //判断singleton是否为null,如果为null,即判定需要实例化
        if (singleton == null) {
            //同步块,线程安全的创建实例
            synchronized (LazySingleton.class){
               // 再次检测实例是否存在
               if (singleton == null){
                   singleton= new LazySingleton();
                    // 字节码层
                    //JIT 即时编译 CPU
                    //1. 分配空间
                    //2. 初始化
                    //3. 引用赋值
                }
            }
        }
        return singleton;
    }
volatile的作用:
1. 防止指令重排序,对象的实例化包含创建和赋值
2. 保证内存可见,volatile修饰的变量,不会被本地缓存,所有线程对该对象的读写都会第一时间同步到主内存。

懒汉模式和饿汉模式的区别

两者的根本区别在于对象是否别提前实例化,以及线程的安全问题

相关文章

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • python中OOP的单例

    目录 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 单例

    目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 设计模式 - 单例模式

    设计模式 - 单例模式 什么是单例模式 单例模式属于创建型模式,是设计模式中比较简单的模式。在单例模式中,单一的类...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • python 单例

    仅用学习参考 目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计...

  • 基础设计模式:单例模式+工厂模式+注册树模式

    基础设计模式:单例模式+工厂模式+注册树模式 单例模式: 通过提供自身共享实例的访问,单例设计模式用于限制特定对象...

  • 单例模式

    JAVA设计模式之单例模式 十种常用的设计模式 概念: java中单例模式是一种常见的设计模式,单例模式的写法...

  • 设计模式之单例模式

    单例设计模式全解析 在学习设计模式时,单例设计模式应该是学习的第一个设计模式,单例设计模式也是“公认”最简单的设计...

网友评论

      本文标题:设计模式——单例模式

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