单例模式(java)

目录

概述

结构

代码实现

饿汉式(静态变量)

饿汉式(静态代码块)

懒汉式(双重检查方式)


概述

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例设计模式分类两种:

饿汉式:类加载就会导致该单实例对象被创建

懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会创建

结构

单例模式的主要有以下角色:

  • 单例类。只能创建一个实例的类

  • 访问类。使用单例类

代码实现

饿汉式(静态变量)

package demo1;/*** @author: ZQH* @project: Design Pattern* @description 饿汉式:静态成员变量* @date: 2023/7/18 0:05*/
public class Singleton {// 1、私有的构造方法private Singleton(){};// 2、 内部实例化对象private static Singleton instance = new Singleton();// 3、外界访问public static Singleton getInstance(){return instance;}}

PS:该方式在成员位置声明Singleton类型的静态变量,并创建Singleton类的对象instance。instance对象是随着类的加载而创建的。如果该对象足够大的话,而一直没有使用就会造成内存的浪费。  

饿汉式(静态代码块)

package demo2;/*** @author: ZQH* @project: Design Pattern* @description 静态代码块* @date: 2023/7/18 0:27*/
public class Singleton {// 1、私有构造private Singleton(){}// 2、创建单例空对象private static Singleton instance;// 3、 静态代码块static {instance = new Singleton();}// 4、对外暴露public static Singleton getInstance(){return instance;}}

PS:该方式在成员位置声明Singleton类型的静态变量,而对象的创建是在静态代码块中,也是对着类的加载而创建。所以和饿汉式的方式1基本上一样,当然该方式也存在内存浪费问题。  

懒汉式(双重检查方式)

package demo3;/*** @author: ZQH* @project: Design Pattern* @description 懒汉式(双重检查方式)* @date: 2023/7/18 13:29*/
public class Singleton {// 私有构造private Singleton(){}// 创建实例 volatile 保证变量的可见性、有序性,避免出现编译器优化 。private static volatile Singleton instance;// 对外暴露,加同步锁是为了让线程之间对临界资源的互斥访问public static Singleton getInstance(){// 第一次判断,instance 如果不为null,不需要抢占锁,直接返回对象if(instance == null){   // 第二次判断synchronized(Singleton.class){if (instance == null) instance = new Singleton();}}return  instance;}}

PS:添加 volatile 关键字之后的双重检查锁模式是一种比较好的单例实现模式,能够保证在多线程的情况下线程安全也不会有性能问题。

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

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

相关文章

labview 弹窗(子vi)

如果你遇到了需要在主vi运行时需要弹窗某个窗口(或者称为子vi,子画面),而且要主画面和子画面能独立运行各自的循环程序,本文能给你帮助。 本文的精髓在于: wait until Donefalse,表示子VI运行的同时,主vi也继续运行后面的代码,主…

win10下解决git报错 Permission denied(publickey)

今天在csdn的GitCode新建了一个项目,然后在windows下git clone时出现错误 gitgitcode.net: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 完整…

Apache Doris (三十一):Doris 数据导入(九)Spark Load 4- 导入Hive数据及注意事项

目录 1. Spark Load导入Hive非分区表数据 2. Spark Load 导入Hive分区表数据 3. 注意事项 进入正文之前,欢迎订阅专题、对博文点赞、评论、收藏,关注IT贫道,获取高质量博客内容! 宝子们订阅、点赞、收藏不迷路!抓紧…

拼多多API接口,百亿补贴商品详情页面采集

电商API的数据类型 电商API提供的数据种类多样,一般可分为以下几类: 1.商品数据:商品ID、商品名称、商品价格、库存等。 2.交易数据:订单号、付款时间、收货人等。 3.店铺数据:店铺ID、店铺名称、开店时间、店铺评…

责任链模式

责任链模式 本文链接:https://blog.csdn.net/feather_wch/article/details/131760462 1、是一种行为型设计模式 2、主要角色 抽象处理者具体处理者 3、允许将请求沿着一系列处理者进行传递,直到有一个处理者可以处理该请求 解耦请求 发送者 和 处理…

如何fork GitHub上的官方仓库

在GitHub中,fork表示复制一个仓库到你自己的GitHub账号下,创建一个独立的副本。通过fork操作,你可以在自己的副本中进行修改、改进和实验,而不会影响到原始仓库或其他人的工作。 当你fork一个仓库时,GitHub将会为你创…

使用Canal同步mysql数据到es

一、简介 Canal主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x 二、工作原理 MySQL主备复制原理 MySQL master 将数据变更写入二进制日志( binary log, 其中记…

常用粗糙集特征选择(属性约简)的算法汇总-基于Feast和MIToolbox工具箱实现

常用粗糙集特征选择(属性约简)的算法汇总 这些算法主要建立在粗糙集工具箱Feast,MIToolbox进行实现。工具箱的安装:https://blog.csdn.net/qq_44822612/article/details/131816235 MIM, MRMR, MIFS, CMIM…

【云原生】K8S单节点搭建

Kubernetes Kubernetes基础概念架构1、基础环境2、安装kubelet、kubeadm、kubectl 2、使用kubeadm引导集群1、下载各个机器需要的镜像2、初始化主节点 Kubernetes核心实战Pod Kubernetes基础概念 kubernetes具有以下特性: ● 服务发现和负载均衡 Kubernetes 可以使…

200行代码写一个简易的C++小黑窗贪吃蛇游戏

分享一个简易的小黑窗贪吃蛇,一共就两百行代码左右(包含注释),很适合初学者巩固语法来练练手. 如果后续需要其他功能也可以再添加. 先小小展示一下: 源码在文末免费领取. 使用工具: VS2019(不是用VS的也可以直接找出cpp和h文件复制到你们用的IDE,甚至是记事本都可以) 闲话…

【hadoop】hadoop的体系架构

hadoop的体系架构 HDFS的体系架构NameNodeedits文件(客户端的操作日志)fsimage文件(元信息文件) DataNodeSecondary NameNode Yarn的体系架构HBase主从架构的单点故障的问题 HDFS的体系架构 NameNode NameNode:主节点…

2023网络安全面试题汇总(附答题解析+配套资料)

随着国家政策的扶持,网络安全行业也越来越为大众所熟知,相应的想要进入到网络安全行业的人也越来越多,为了更好地进行工作,除了学好网络安全知识外,还要应对企业的面试。 所以在这里我归总了一些网络安全方面的常见面…

Vue中的事件处理

一,基本使用 1.使用v-on:事件名或者事件名绑定事件 常见的事件有: onclick, 鼠标单击事件; ondblclick, 鼠标双击事件;onmousedown,鼠标按下去的事件;onmouseup,鼠标弹起事件; onmouseover,onmouseente…

巧妙使用 CSS 渐变来实现波浪动画

目录 一、波浪的原理 二、曲面的绘制 三、波浪动画 四、文字波浪动画 五、总结一下 参考资料 之前看到coco[1]的这样一篇文章:纯 CSS 实现波浪效果![2],非常巧妙,通过改变border-radius和不断旋转实现的波浪效果&#xff0c…

MiniGPT4系列之二推理篇命令行方式:在RTX-3090 Ubuntu服务器推理详解

MiniGPT4系列之一部署篇:在RTX-3090 Ubuntu服务器部署步骤详解_seaside2003的博客-CSDN博客 MiniGPT4系列之二推理篇命令行方式:在RTX-3090 Ubuntu服务器推理详解_seaside2003的博客-CSDN博客 MiniGPT4系列之三模型推理 (Web UI):在RTX-309…

中国国债发行数据集(2002-2023)

国债是由国家发行的债券,由于国债的发行主体是国家,所以它具有最高的信用度,被公认为是最安全的投资工具。国债按照交易市场的不同分为三类,即银行间市场国债、交易所市场国债和柜台市场国债;按照交易方式的不同分为三…

git使用问题记录-权限

注意点: 1、在远程仓库中直接创建项目时,默认分支为main 2、git push报错 原因:即使是项目文件的创建者,但上层目录的权限为developer,无法push项目,找上层管理员修改权限为maintainer或owner可push代码…

电路分析 day01 一种使能控制电路

本次分析的电路为 一种使能控制电路 (站在别人的肩膀上学习) 资料来源 : 洛阳隆盛科技有限责任公司的专利 申请号:CN202022418360.7 1.首先查看资料了解本次电路 1.1 电路名称: 一种使能控制电路 1.2 电路功能…

C++基础算法高精度篇

📟作者主页:慢热的陕西人 🌴专栏链接:C算法 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 主要讲解了高精度算法的四种常用的计算 文章目录 Ⅲ. 高精度Ⅲ. Ⅰ . …

【外卖系统】环境的搭建

搭建数据库 1.创建数据库,名字叫reiggie 2.导入数据库 创建Maven项目 1.创建项目 2.检查项目新建的是否有问题 3.导入pom.xml文件 4.导入application.yml文件 在从gittee上down的代码的基础上,修改一下端口号,数据库的名称什么的 …