首页 > 其他分享 >单例模式

单例模式

时间:2024-10-23 20:43:48浏览次数:6  
标签:加锁 对象 模式 线程 单例 方法

1.单例模式

所谓单例模式,就是保证类在内存中只有一个对象。如何保证内存中只有一个对象呢,

就需要私有化构造器,私有化new 对象的方法,然后提供一个公共方法来访问该单例类。

 1.1 饿汉式:类加载的时候先new好对象

 

 

 从上面代码我们可以看出该方式在成员位置声明singleton类型的静态变量,并没有进行对象的赋值操作,

那什么时候赋值的呢?当调用getInstance()方法获取singleton类的对象的时候才创建singleton类的对象,

这样就实现了懒加载的效果。但如果是多线程环境,会出现线程安全问题。可以在如下位置加锁

 

懒汉式双重检查锁:

再来讨论一下懒汉模式中加锁的问题,对于 getInstance()方法来说,绝大部分的操作都是读操作,读操作是线程安全的,所以
我们没必让每个线程必须持有锁才能调用该方法,我们可以调整加锁的时机。由此也产生了一种新的实现模式:双重检查锁模式。

双重检查锁模式是一种非常好的单例实现模式,解决了单例、性能、线程安全问题,上面的双重检测锁模式看上去完美无缺,其

实是存在问题,在多线程的情况下,可能会出现空指针问题,出现问题的原因是Jv在实例化对象的时候会进行优化和指令重排序

操作。要解决双重检查锁模式带来空指针异常的问题,只需要使用 volatile关键字, volatile关键字可以保证可见性和有序性

 

 

 序列化破坏单例:参考:https://blog.csdn.net/leo187/article/details/104332138

Objectinputstream底层有一个readOrdinaryObject方法有调用hasReadResolveMethod的判断,这个方法是验证目标类是否包含一个方法名为readResolve的方法,

如果有就执行desc.invokeReadResolve,即我们在单例创建的readResolve方法,并将获得的对象返回,如果没有就通过newInstance()方法反射实例化一个新的对象,

那样就会是两个新对象了,单例就被破坏。

 

 

标签:加锁,对象,模式,线程,单例,方法
From: https://www.cnblogs.com/yellowhl/p/18395427

相关文章

  • 工厂方法模式
     1、理解工厂方法模式的动机,掌握该模式的结构;2、能够利用工厂方法模式解决实际问题。 [实验任务一]:加密算法目前常用的加密算法有DES(DataEncryptionStandard)和IDEA(InternationalDataEncryptionAlgorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。1. 类图 ......
  • 实验2:简单工厂模式
    [实验任务一]:女娲造人使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,如果传入参数R,则返回一个Robot对象。请用程序设计实现上述场景。实验要求:1.画出对应的类图;2.提交源代码;3.注意编程规范。类图:  2、代......
  • 实验2:简单工厂模式
    [实验任务一]:女娲造人使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,如果传入参数R,则返回一个Robot对象。请用程序设计实现上述场景。  1. 类图   2.源代码//抽象产品类:Person接口publicinterfaceP......
  • Java设计模式的学习之适配器模式
    适配器模式目录适配器模式适配器模式的主要角色包括:适配器模式的两种主要形式:应用场景:优点:缺点:适配器模式(AdapterPattern)是一种结构型设计模式,其主要目的是将一个类的接口转换成客户端期望的另一个接口,使得原本因接口不兼容而不能一起工作的类可以一起工作。适配器模式通常用......
  • OpenSSL异步模式流程梳理
    源码来源于OpenSSLMasterCommitIDd550d2aae531c6fa2e10b1a30d2acdf373663889。总览核心入口函数为ssl_start_async_job,以SSL_do_handshake为入口举例分析,同时通过标注步骤【1~N】,来明确阅读的顺序。步骤【1】到步骤【18】为一个阶段步骤【19】到步骤【23】为一个阶......
  • 产品有了模式切换功能,众口不再难调!
    在科技飞速发展的今天,我们的产品迎来了重大突破——模式切换功能。这一创新之举,让众口不再难调。无论你是追求高效便捷的商务人士,还是喜欢沉浸式体验的娱乐爱好者,亦或是注重简约实用的日常用户,都能在不同模式中找到最适合自己的状态。轻松切换,满足你的各种需求。从此,不再为......
  • [Ansible实践笔记]自动化运维工具Ansible(一):初探ansible&ansible的点对点模式
    文章目录Ansible介绍核心组件任务执行方式实验前的准备更新拓展安装包仓库在ansible主机上配置ip与主机名的对应关系生成密钥对将公钥发送到被管理端,实现免密登录测试一下是否实现免密登录常用工具ansibleansible—docansible—playbook主要配置文件Ansible模块配置......
  • Java的模板模式 - 设计模式之行为模式
    模板模式(TemplateMethodPattern)是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法的结构即可重新定义该算法的某些特定步骤。在Java中,模板模式通常通过抽象类来实现。下面是一个使用模板模式的示例代码,以及详细的......
  • 虚拟机设置静态IP并启用桥接模式
    虚拟机设置静态IP并启用桥接模式一、准备工作在开始之前,请确保你已经安装了VMware或其他虚拟机软件,并且已经创建了一个虚拟机实例。此外,还需要了解宿主机的网络配置,包括IP地址、子网掩码、网关等信息,可通过ipconfig/all查看。记录上述信息:IPv4地址:10.10.97.210子网掩码:25......
  • 大数据的计算模式
    大数据的计算模式可以分为批量计算(batchcomputing)和流式计算(streamcomputing)两种形态。批量计算首先进行数据的存储,然后对存储的静态数据进行集中计算。Hadoop是典型的大数据批量计算架构,由HDFS分布式文件系统负责静态数据的存储,并通过MapReduce将计算逻辑分配到各数据节......