系列一、 单例设计模式

一、单例设计模式

1.1、概述

        单例模式(Singleton Pattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建者模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

1.2、应用场景

        只需要一个实例,例如:各种Manager、各种Factory

二、单例模式的结构

2.1、单例模式主要有以下角色

  • 单例类:只能创建一个实例的类
  • 访问类:使用单例类

2.2、单例模式的实现

  • 饿汉式:类加载就会导致该单例对象被创建
  • 懒汉式:类加载不会导致该单例对象被创建,当首次使用该对象时才会创建

2.3、单例模式-饿汉式

2.3.1、静态成员变量

public class SingletonDemo1 {// 1、私有构造方法private SingletonDemo1() {}// 2、在当前类中创建本类对象private static SingletonDemo1 instance = new SingletonDemo1();// 3、对外提供获取本类实例对象的公共访问方式public static SingletonDemo1 getInstance() {return instance;}
}

2.3.2、静态代码块

public class SingletonDemo2 {// 1、私有构造方法private SingletonDemo2() {}// 2、在当前类中声明当前类的类型变量private static SingletonDemo2 instance;// 3、在静态代码块中进行赋值static {instance = new SingletonDemo2();}// 4、对外提供获取该类对象的方法public static SingletonDemo2 getInstance() {return instance;}}

2.3.3、存在的问题

        由于对象的创建是随着类的加载而创建,所以存在内存浪费的问题。

2.4、单例模式-懒汉式

2.4.1、线程不安全

/*** * @Description 懒汉式:线程不安全* 存在的问题:多线程情况下,会创建多个实例*/
public class SingletonDemo3 {// 1、私有构造方法private SingletonDemo3() {}// 2、在当前类中声明当前类的类型变量private static SingletonDemo3 instance; // 这是声明了一个该类型的变量,并没有进行赋值// 3、对外提供获取该类对象的方法public static SingletonDemo3 getInstance() {if (instance == null) {instance = new SingletonDemo3();}return instance;}
}

2.4.2、线程安全

/*** @Description 懒汉式:线程安全* 存在的问题:*      对于getInstance()方法来说,绝大部分的操作都是读操作,读操作是线程安全的,所以我们没必要让每个线程必须持有锁才能调用该方法,*   而且加锁在多线程场景下,会严重影响性能。*/
public class SingletonDemo4 {// 1、私有构造方法private SingletonDemo4() {}// 2、在当前类中声明当前类的类型变量private static SingletonDemo4 instance; // 这是声明了一个该类型的变量,并没有进行赋值// 3、对外提供获取该类对象的方法public static synchronized SingletonDemo4 getInstance() {if (instance == null) {instance = new SingletonDemo4();}return instance;}}

2.4.3、双重锁检查机制【推荐】

/*** @Description 懒汉模式:双重锁检查机制*/
public class SingletonDemo5 {// 1、私有构造方法private SingletonDemo5() {}/*** 2、在当前类中声明当前类的类型变量* 说明:添加volatile关键字之后的双重检查锁模式是一种比较好的单例实现模式,能够保证在多线程的情况下线程安全,* 并且不会影响性能。*/private static volatile SingletonDemo5 instance; // 这是声明了一个该类型的变量,并没有进行赋值// 3、对外提供获取该类对象的方法public static SingletonDemo5 getInstance() {// 3.1、第一次判断,如果instance不为null,不需要抢占资源,直接返回if (instance == null) {synchronized (SingletonDemo5.class) {// 3.2、第二次判断if (instance == null) {instance = new SingletonDemo5();}}}return instance;}
}

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

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

相关文章

Android Matrix (二)具体图形变换参数的获取

Android Matrix (二)具体图形变换参数的获取 Matrix 类在 Android 中用于表示 3x3 的变换矩阵。这个矩阵可以应用于画布(Canvas),视图(View)或者位图(Bitmap)&#xff0…

服务器日常维护要素,应该如何做好维护

维护服务器的目的是为了让服务器的性能保持最佳状态,发现问题及时解决,没有问题也可以对相关的应用和配置进行调优。但也有很多用户疑问,服务器具体会有哪些方面需要维护的,今天就一起来看看吧。 服务器日常维护,主要包…

Python基础入门第九课笔记(文件和文件夹)

1,新建文本并且写内容 a open(1.text,w) a.write("""aaa bbb ccc""") a.close() 2,seek( )移动文件指针 文件对象.seek(偏移量,起始位置) # 起始位置:0开头,1当前位置,2文件结尾…

预训练模型的分类,以及代表模型介绍

预训练模型主要可以分为几个大的类型,这些类型通常基于它们所应用的任务和数据类型。以下是一些主要类型的预训练模型及其代表性模型: 自然语言处理(NLP)模型: 自回归语言模型:这类模型根据上文内容预测下一…

7+坏死性凋亡+分型+预后模型+实验,筛坏死性凋亡相关基因并建模

今天给同学们分享一篇生信文章“MLKL and other necroptosis-related genes promote the tumor immune cell infiltration, guiding for the administration of immunotherapy in bladder urothelial carcinoma”,这篇文章发表在Apoptosis期刊上,影响因子…

【新华三】IPsec VPN 实验配置(地址固定)

【新华三】IPsec VPN 实验配置(地址固定) 注意实验需求配置思路配置命令拓扑R1基础配置配置第一阶段 IKE SA配置第二阶段 IPsec SA ISP_R2基础配置 R3基础配置配置第一阶段 IKE SA配置第二阶段 IPsec SA PCPC1PC2 检查建立成功查看命令清除IKE / IPsec S…

分享几个网盘资源搜索地址,总能找到你想要的

目录 [TOC](目录)一、前言二、地址分享三、结尾 一、前言 分享几个网盘搜索网站,总能找到你想要的。 二、地址分享 盘搜搜: https://pansoso.com/ 搜网盘: https://www.swangpan.com/ fastsoso: https://www.fastsoso.cc 猫狸盘搜: https://www.alipansou.com…

虚拟机安装intel架构的银河麒麟V10(SP1)

一 背景 银河麒麟是国产操作系统之一,是基于Linux内核的桌面操作系统,有自己的应用中心,具有一定的生态系统。今从官网下载了V10(SP1)镜像文件,在Windowns的VMware虚拟机上安装试用。 二 安装 1、 首先安装…

【漏洞复现】锐捷RG-UAC统一上网行为管理系统信息泄露漏洞

Nx01 产品简介 锐捷网络成立于2000年1月,原名实达网络,2003年更名,自成立以来,一直扎根行业,深入场景进行解决方案设计和创新,并利用云计算、SDN、移动互联、大数据、物联网、AI等新技术为各行业用户提供场…

桶装水在线订水送水系统平台搭建

在线订水系统,为您带来更快捷、更优质的服务。不仅是用户福音,更是商家营销利器。一体化管理,轻松搞定用户、水站、商品、订单及售后。多种营销活动,激发用户复购意愿。 功能亮点如下: 1. 注册登录:手机号…

Mysql 恢复误删库表数据

一、前提 1、如果你的数据库有备份文件,自己还原即可。 2、如果没有备份文件,那首先检查下你的 binlog 是否开启。如果未开启,那你就不用往下看了。如果开启了,可以往下看看。 1.1 查看位置 可以通过以下的命令查看是否开启了 bi…

梯度下降和反向传播:能改

一、背景 1.问题 通过顶点坐标公式,求解出抛物线最低点的w坐标,得到了让误差代价最小的w。同样的,也通过算数说明了这种一步到位求解的方式固然是好,但是在输入特征过多、样本数量过大的时候,却非常消耗计算资源。 …

Windows Server 2012 R2 Standard 版英特尔 以太网 wifi 无线网驱动网络适配器驱动程序

Windows Server 2012 R2 Standard 版安装好以后发现没有网络,网上搜了很多都是不行,后来找到了方法,解决你方法如下: Windows Server 2012 R2 Standard 版英特尔网络适配器驱动程序 1、以太网驱动,下载解压安装即可…

echarts - xAxis.type设置time时该如何使用formatter的分级模板

echarts 文档中描述了x轴的多种类型 一、type: ‘value’ ‘value’ 数值轴,适用于连续数据。 此时x轴数据是从零开始,有数据大小的区分。 【注意】 因为xAxis.data是为category服务的,所以xAxis.data里面设置的数据无效。 二、type: ‘ca…

前端适配750px设计稿

全局引入 (function(doc, win) {const docEl doc.documentElement,resizeEvt orientationchange in window ? orientationchange : resizeconst setFont function() {let clientWidth docEl.clientWidth;if (!clientWidth) return;if (clientWidth > 750) {docEl.styl…

【自学笔记】01Java基础-07面向对象基础-03常量、枚举类、抽象类、多态详解

记录java基础学习中有关常量、枚举类、抽象类和多态的内容。 1 常量 什么是常量? 常量是使用了public static final修饰的成员变量,必须有初始化值,而且执行的过程中其值不能被改变。 常量名的命名规范:英文单词全部大写&#x…

【JAVA】throw 和 throws 的区别?

🍎个人博客:个人主页 🏆个人专栏: JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 throw: throws: 区别: 作用: 使用位置: 个数: 应…

软件测试|Python对JSON的解析和创建详解

简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,已经成为当今互联网应用中广泛使用的数据格式之一。Python提供了内置的模块来解析和创建JSON数据,使得在Python中处理JSON变得非常简单。本文将详细介绍Python…

复试 || 就业day10(2024.01.05)算法篇

文章目录 前言等价多米诺骨牌对的数量拼写单词“气球” 的最大数量独一无二的出现次数找出井字棋的获胜者种花问题用最少数量的箭引爆气球划分字母区间最小数字游戏 前言 💫你好,我是辰chen,本文旨在准备考研复试或就业 💫文章题目…