单例模式之常见模式详解

news2024/11/26 19:34:43

单例模式之常见模式详解

  • 单例模式的定义
  • 单例模式的分类
    • 饿汉模式
    • 懒汉模式
  • 单例模式的主要特点
  • 单例模式的应用场景
  • 总结

单例模式的定义

单例模式是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。

在单例模式中,类的构造函数被私有化,这样其他类就无法直接创建该类的实例。而是通过一个静态方法或者属性来获取类的唯一实例。

单例模式的分类

在Java中实现单例模式的方法有很多,这里介绍最常见的两种

饿汉模式

以下是具体实现:


public class Singleton {
    //此处,先把实例创建出来
    private static  Singleton instance=new Singleton();

    //如果需要使用这个唯一实例,统一通过 Singleton.getInstance()方法来获取。
    public static Singleton getInstance(){
        return  instance;
    }

    //为了避免Singleton 类不小心被复制出多份来
    //把构造方法设置为private.在类外面,就无法通过new的方式来创建这个Singleton实例
    private Singleton(){

    }
}

在这里插入图片描述

此处static起着至关重要的作用:

  • static 保证这个实例唯一
  • static 保证这个实例确实在一定时机中被创建出来
    static 修饰使得当前 instance 属性是类属性,类属性是在类对象上的,类对象在一个java进程里是唯一的(只是在类加载阶段被创建出一个实例)

补充知识点
类加载:
java代码中的每个类都会在编译完成后得到 .class 文件。JVM运行时会加载这个 .class文件,读取其中的二进制指令,并且在内存中构造出对应的类对象。(形如Singleton.class)

在这里插入图片描述

  • 把构造方法设为private,在类外面,就无法通过new的方式来创建这个实例了。

饿汉模式的优点是实现简单、线程安全,因为实例在类加载时就已经创建好了。但缺点是如果该实例在整个程序运行期间没有被使用到,会造成资源浪费。

懒汉模式

以下是具体实现:

public class SingletonLazy {

    private static  SingletonLazy instance=null;

    public static SingletonLazy getInstance(){
        if(instance==null){
            instance=new SingletonLazy();
        }
        return instance;
    }

    private SingletonLazy(){

    }

}

在这里插入图片描述

懒汉模式没有在类加载时进行初始化,而是在第一次使用该类的实例时,通过判断实例是否已经存在来决定是否创建实例。(延迟实例化,在需要时才创建唯一的实例。)

懒汉模式优点是实现简单,只有在需要时才创建实例,避免了资源浪费。但缺点是在多线程环境下可能会出现线程安全问题,需要额外处理。

如何让上述懒汉模式能够线程安全呢?进行加锁操作
在这里插入图片描述

由于使用了synchronized关键字,可能会影响性能。为了提高性能,可以使用双重检查锁定等方式进行优化。

上述代码会导致每次 getInstance() 操作都要加锁,加锁操作是有开销的,然而如果判断instance 的值是非空时,就会直接触发return操作,此时由于没有修改操作,就没必要加锁。

如下:
在这里插入图片描述

为了避免上述代码可能会遇到的内存可见性问题和指令重排序问题,使用volatile关键字进行优化。
代码如下:

public class SingletonLazy {
    private volatile static  SingletonLazy instance=null;

    public static SingletonLazy getInstance(){

        if (instance == null) {
            synchronized (SingletonLazy.class) {
                if (instance == null) {
                    instance = new SingletonLazy();
                }
            }
        }

        return instance;
    }

    private SingletonLazy(){
    }

}

单例模式的主要特点

  • 私有的构造函数:通过将构造函数设为私有,防止其他类直接创建实例。
  • 静态的实例变量:在类内部定义一个静态的实例变量,用于保存类的唯一实例。
  • 静态的获取方法:提供一个静态的方法或属性,用于获取类的唯一实例。这个方法会在第一次调用时创建实例,并在后续调用时返回同一个实例。

单例模式的应用场景

  • 系统中某个类的对象只需要存在一个实例,例如配置信息类、日志记录类等。
  • 需要频繁创建和销毁对象的场景,通过使用单例模式可以节省系统资源。
  • 对象需要被共享或者全局访问的场景,例如线程池、数据库连接池等。

总结

在实现单例模式时,需要注意线程安全性和延迟加载的问题。可以使用加锁、双重检查锁定等方式来确保线程安全,并且在需要时才创建实例,避免资源浪费。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023需求最高的编程语言:Python、JavaScript和Java

科技招聘平台 CodinGame 和 CoderPad 最新发布了一份 2023 年科技行业招聘报告,基于对 14000 名专业人士的调查,对 2023 年科技行业招聘人员和求职者可能面临的情况进行了深入分析。其中一些关键亮点包括: 59% 的开发人员没有计算机科学方面的…

吴恩达机器学习笔记-week2

第2周 目录 第2周 四、多变量线性回归(Linear Regression with Multiple Variables) 4.1 多维特征4.2 多变量梯度下降4.3 梯度下降法实践1-特征缩放4.4 梯度下降法实践2-学习率4.5 特征和多项式回归4.6 正规方程4.7 正规方程及不可逆性(可选) 四、多变量线性回归(Linear Regres…

docker的安装以及常用命令详解

目录 一、docker简介 二、docker安装 三、常用命令 1、显示 Docker 版本信息 2、显示 Docker 系统信息,包括镜像和容器数 3、帮助 四、镜像管理 1、列出镜像 2、获取一个新的镜像 3、查找镜像 4、删除镜像 5、镜像导入与导出 五、容器生命周期 1、运行…

Bring Your Data!Self- supervised Evolution of Large Language Models

Bring Your Data!Self- supervised Evolution of Large Language Models IntroductionMethod参考 Introduction 这篇论文提出了一种自监督的评估方式来衡量大型语言模型的能力和局限性。常规的基于数据集的评估方式存在一些缺点: 需要不断新建数据集。存在数据集和…

外包软件定制开发中时间和进度管理

引言 时间和进度管理是外包软件定制开发项目中至关重要的方面。有效地管理时间和进度可以确保项目按计划顺利进行,减少延误和风险,从而提高交付的可靠性和质量。然而,由于外包团队和客户位于不同的地理位置和时区,时间和进度管理…

[MySQL]MySQL索引

[MySQL]MySQL索引 文章目录 [MySQL]MySQL索引1. 索引的概念2. 认识磁盘磁盘的内部结构磁盘中的一个盘片结构定位扇区磁盘随机访问与连续访问 3. MySQL与磁盘交互的基本单位4. 建立共识5. 索引的理解创建测试表进行测试理解单个page理解多个page页目录其他的数据结构的问题聚簇索…

ModaHub魔搭社区:AI原生云向量数据库Zilliz Cloud角色与权限

目录 组织和项目 角色和权限 访问权限等级 文档推荐 Zilliz Cloud 提供访问控制。您可以灵活管理用户,为用户分配不同角色,授予用户不同的集群资源访问和操作权限。无权限的用户无法访问特定资源。 组织和项目 Zilliz Cloud 通过组织和项目实现访问控制和资源分离。 …

PostgreSQL数据库的部署与优化

文章目录 一.PostgreSQL数据库1.PostgreSQL数据库的概念1.1 PostgreSQL 的核心概念 2.PostgreSQL特点3.PostgreSQL的作用4.PostgreSQL的应用场景5.PostgreSQL、mysql、oracle的对比 二.Linux系统安装PostgresSQL(Centos7)1.更新yun源2.安装PostgreSQL2.1…

【消息队列设计总结】RabbitMQ、Kafka、RocketMQ对比之运行架构

目录 1 RabbitMQ 1.1 工作原理 1.2 名词解释 1.3 交换机的几种类型 2 Kafka 2.1 工作原理 2.2 基本概念 3 RocketMQ 3.1 工作原理 3.2 基本概念 4 RabbitMQ & Kafka & RocketMQ的差异 5 参考文档 1 RabbitMQ 1.1 工作原理 1.【消息生产】生产者&#xff0…

润本股份提交注册:拟募资约9亿元,赵贵钦、鲍松娟夫妇为实控人

撰稿|汤汤 来源|贝多财经 近日,润本生物技术股份有限公司(下称“润本股份”)在上海证券交易所递交招股书(注册稿)。据贝多财经了解,润本股份于2023年3月递交上市申请材料,准备在上海证券交易所…

MySQL-DDL-表的结构-查询修改删除

DDL(表操作) 查询 查询当前数据库所有表:show tables 查询表结构:desc 表名 查询建表语句:show create table 表名 修改(主要还是通过图形化界面进行操作) 添加字段:alter table …

王道考研数据结构第六章知识点总结

6.1.1图的基本概念 顶点集一定是非空集,边集可以是空集 非连通图:让任意n-1个顶点之间两两相连,另一个顶点与任意一个都不存在路径,则为非连通图的最大边数。 注意长三角地区铁路网不属于连通分量,因为它没有包含尽可能…

简单认识MySQL数据库索引

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、索引的概念1、简介2、作用3、索引的副作用:4、创建索引的原则依据5、索引的分类 二、索引的增删改查1.创建索引(1)创建普通索…

ios 通过xib自定义控件

通过xib自定义控件 xib和stroyboayd对比 共同点: 都是用来描述软件界面 都是用interface Builder工具来编辑 本质都是转换成代码去创建控件 不同点: xib是轻量级的,用来描述局部ui界面 创建模型文件 XMGCar 自定义控件 xib 图形设计 …

zookeeper和kafka与EFLFK集群

zookeeper和kafka 一:Zookeeper 概述1.Zookeeper 定义2.Zookeeper 工作机制3.Zookeeper 特点4.Zookeeper 数据结构5.Zookeeper 应用场景6.Zookeeper 选举机制6.1.第一次启动选举机制6.2.非第一次启动选举机制(1)当ZooKeeper 集群中的一台服务…

支持向量机(SVM)的超参数调整 C 和 Gamma 参数

作者:CSDN @ _养乐多_ 支持向量机(Support Vector Machine,SVM)是一种广泛应用的监督式机器学习算法。它主要用于分类任务,但也适用于回归任务。在本文中,我们将深入探讨支持向量机的两个重要参数:C和gamma。在阅读本文前,我假设您对该算法有基本的了解,并专注于这些…

【MySQL】MySQL在Centos7环境下安装

目录 一、卸载不要的环境 1.1、查看是否有安装mysql 1.2、关闭运行的程序 1.3、卸载安装 二、配置yum 源 2.1、下载yum 源 2.2 安装yum源 2.3 查看是否已经生效 三、安装mysql服务 四、启动服务 五、登录方法 方法一(不行就下一个) 方法二(不…

前端必看的书籍

十本学习前端必看书籍 第一本,入门 《Head first HTML&CSS》 最好的入门书。看两遍就对HTML & CSS 有个大概印象了。 此时把w3cschool作为备查手册收藏起来 第二本《CSS权威指南(第三版)》 最权威的CSS书籍,除了阅读W3C的文档外的不二选择(就是翻…

HDFS体系结构及基本概念

1、hdfs体系结构及基本概念 1.1 namenode是什么,作用是什么 Namenode维护了很多得信息,那么这么多信息存放在哪里呢?在hadoop中有个core-site.xml的文件 路径是 [root@cdp3 hadoop]# pwd /home/hadoop/hadoop-2.2.0/etc/hadoop 1.2 datanode是什么,作用是什么 data…

Kubernetes对象深入学习之三:对象属性

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《Kubernetes对象深入学习》系列的第三篇,主要内容是关于对象属性的知识点,关于对象属性,先通过一个具体…