首页 > 其他分享 >常用设计模式-单例模式(Singleton pattern)

常用设计模式-单例模式(Singleton pattern)

时间:2024-07-27 16:29:12浏览次数:18  
标签:Singleton pattern uniqueInstance 实例 线程 单例 volatile 设计模式

常用设计模式-单例模式(Singleton pattern)

一、单例模式目的

使用单例模式第一步要了解其作用,单例理解为一个实例(one instance)。保证一个类只有一个它的实例。在实际开发中,如线程池,数据库连接对象等。

二、实现思路

为了保证 one class one instance

①则需要保证实例全局唯一,保证实例全局唯一的方式这里选用的是可以使用 static 关键字修饰实例引用,静态字段全局共享,但是需要保证该实例引用自始至终只引用一个实例。实例可以在 bean 创建时创建(饥饿模式),也可以在需要时才实例化(减轻服务器压力,懒惰模式)。

②并且构造函数只能私有化,避免任何线程都能 new 一个实例

③其次开放一个访问入口,即属于类的 get 静态方法,用 static 修饰。

④获取实例时需要先判断实例已经创建才获取,未创建需要创建唯一的实例,下面为双重验证 + volatile方式创建实例的实现

双重验证 + volatile

public Class Singleton(){
    private volatile static Singleton uniqueInstance;

private Singleton() {
}

public static Singleton getUniqueInstance() {
   //先判断对象是否已经实例过,没有实例化过才进入加锁代码
    if (uniqueInstance == null) {
        //类对象加锁
        synchronized (Singleton.class) {
            if (uniqueInstance == null) {
                uniqueInstance = new Singleton();
            }
        }
    }
    return uniqueInstance;
}
}

如果单使用双重验证,由于已获得锁的线程在创建实例时,线程分三步执行指令(分配内存空间地址,初始化实例,引用指向内存空间地址),三步操作并非按排序进行,有可能先执行了第 3 步再执行第 2 步,另一线程在第一次验证时判断到实例引用不为空,即返回,线程对该实例引用的后续使用会造成空指针异常 。因此需要使用 volatile 保证指令不被重排序

但如果单使用 volatile,则不能保证线程实例化时这个操作的原子性。因此双重验证 + volatile便是处于这样的考虑。

标签:Singleton,pattern,uniqueInstance,实例,线程,单例,volatile,设计模式
From: https://www.cnblogs.com/zyiyiblog/p/18327118

相关文章

  • Spring中使用到的设计模式及其源码分析
    前言众所周知,Spring框架是一个强大而灵活的开发框架。这不,上次的面试刚问到这些,没防住!!!因此下来总结一下。这篇文章主要介绍Spring中使用到的设计模式,自己做个面试复盘,同时希望能帮助到其他小伙伴儿们。工厂模式相信大家面试题都背过,Spring通过工厂模式来创建和管理Bean......
  • Android开发- 正则表达式Pattern类与Matcher类的解析与使用
    简介使用正则表达式需要用到两个类:Pattern类与Matcher类其中Pattern类用来制定匹配规则,而Matcher类用来接收需要进行匹配的字符串Pattern类Patternpattern=Pattern.compile(Stringregex);:Pattern类的创建方法参数解析:regex:取值类型为正则表达式字符串;设置匹配规则......
  • 【golang设计模式】—— 外观模式
    模式定义外观模式(FacadePattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调......
  • Pattern的多种匹配模式
    参考:好文→Pattern的多种匹配模式–《JAVA编程思想》42目录标题单行匹配多行匹配正则匹配忽略大小写Unicode字符集中的大小写敏感字符都将表示字面含义考虑字符的等价性会忽略正则表达式中的空格及#开始后面的部分只会将`\n`认作换行符`\w`可以匹配任何语言的......
  • 【golang设计模式】—— 简单工厂模式
    模式定义简单工厂模式(SimpleFactoryPattern):又称为静态工厂方法(StaticFactoryMethod)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。模式结构工......
  • C++设计模式汇总
    李忠建老师讲授设计模式笔记更新到抽象工厂模式:组件协作类:模板方法策略模式观察者模式单一职责类:装饰器模式桥模式模式对象创建类:工厂方法抽象工厂方法原型模式构建器模式对象性能类:单例模式享元模式接口隔离类:门面模式代理模式适配器模式中介者模式状态变......
  • 设计模式C++001__模板方法
    设计模式C++001__模板方法“组件协作”模式:现代软件专业分工之后的第一个结果就是“框架与应用程序的划分”,组件“协作”模式通过晚绑定,来实现框架与应用程序之间的松耦合。包括:模版方法,观察者模式,策略模式1、模板方法模式:动机:在软件构建过程中,对于一项任务,它常常有稳定的整......
  • 设计模式C++002__策略模式
    设计模式C++002__策略模式1、动机:在软件构建过程中,某些对象使用的算法是多种多样的,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。?如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?......
  • 设计模式C++003__观察者模式
    设计模式C++003__观察者模式1、动机:在软件构建过程中,我们需要为某些对象建立一种“通过依赖关系”--一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使得软件不好抵御变化。?使用面向对象技术,可以将这种依赖关系弱化,并形成......
  • 设计模式C++004__装饰器模式
    设计模式C++004__装饰器模式在软件组件设计中,如果职责划分不清晰,使用继承得到的结果往往会随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候关键是划清责任。单一职责模式分类中的设计模式:装饰器模式,桥模式1、装饰器模式:动机:在某些情况下,我们可能会“过渡地使用继承来扩......