2.设计模式--创建者模式--单例设计模式

2.设计模式–创建者模式–单例设计模式

一个程序整个运行过程中,该实例的对象只被创建一次。

2.1单例设计模式的分类:

饿汉式:类加载时创建单例类的对象
懒汉式:类加载时不创建单例类的对象,第一次访问时创建单例类的对象。

2.2单例设计模式

2.2.1饿汉式(静态变量)

/*** 饿汉式:静态变量创建类的对象*/
public class Singleton {//构造方法私有private Singleton(){}//静态变量创建类的对象private static Singleton instance = new Singleton();//对外提供静态方法public static Singleton getInstance(){return instance;}
}

如果对象不创建会导致内存浪费。

2.2.2 饿汉式(静态代码块)

/*** 饿汉:静态代码块*/
public class Singleton2 {//构造方法私有private Singleton2(){}private static Singleton2 instance;//静态代码块static{instance = new Singleton2();}//对外提供静态对象获取该对象public static Singleton2 getInstance(){return instance;}
}

如果对象不创建会导致内存浪费。

2.2.3 懒汉式(方式一)

/*** 懒汉式*/
public class Singleton3 {/*** 构造方法私有*/private Singleton3(){};//在成员位置创建该类的对象private static Singleton3 instance;/*** 静态获取方法* @return*/public static Singleton3 getInstance(){if(instance==null){instance = new Singleton3();}return instance;}
}

多线程环境,会出现线程安全问题。

2.2.4 懒汉式(方法上synchronized锁)

public class Singleton4 {//私有构造方法private Singleton4(){};//在成员位置创建该类的对象private static Singleton4 instance;/*** 提供静态方法获取变量*/public synchronized static Singleton4 getinstance(){if(instance==null){instance = new Singleton4();}return instance;}
}

在初始化instance的时候才会出现线程安全问题,一旦初始化完成就不存在了。

2.2.4 懒汉式(双重检查锁)

public class Singleton5 {private Singleton5(){};private static Singleton5 instance;public static Singleton5 getInstance(){if(instance==null){//第一次判断,如果instance不为null,不进入抢锁阶段,直接返回实例synchronized (Singleton5.class){//抢到锁之后再次判断是否为nullif(instance==null){instance = new Singleton5();}}}return null;}
}

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

2.2.5懒汉式(volatile关键字)

public class Singleton6 {private Singleton6(){};//volatile参数存在,不会指令重排序private static volatile Singleton6 instance;public static Singleton6 getInstance(){if(instance==null){//第一次判断,如果instance不为null,不进入抢锁阶段,直接返回实例synchronized (Singleton6.class){//抢到锁之后再次判断是否为nullif(instance==null){instance = new Singleton6();}}}return null;}
}

2.2.6懒汉式(静态内部类方式)

public class Singleton7 {//私有方法构造private Singleton7(){};private static class singletonHolder{private static final Singleton7 INSTANCE = new Singleton7();}public static Singleton7 getInstance(){return singletonHolder.INSTANCE;}
}

静态属性由于被 static修饰,保证只被实例化一次,并且严格保证实例化顺序

3.1破坏单例模式

1.序列化和反序列化

public class SingletonDemo {public static void main(String[] args) throws Exception {//往文件中写对象writeObject2File();//从文件中读取对象Singleton s1 = readObjectFromFile();Singleton s2 = readObjectFromFile();//判断两个反序列化后的对象是否是同一个对象System.out.println(s1 == s2);}private static Singleton readObjectFromFile() throws Exception {//创建对象输入流对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\a.txt"));//第一个读取Singleton对象Singleton instance = (Singleton) ois.readObject();return instance;}public static void writeObject2File() throws Exception {//获取Singleton类的对象Singleton instance = Singleton.getInstance();//创建对象输出流ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\a.txt"));//将instance对象写出到文件中oos.writeObject(instance);}
}

2.反射

public class Test {public static void main(String[] args) throws Exception {//获取Singleton类的字节码对象Class clazz = Singleton.class;//获取Singleton类的私有无参构造方法对象Constructor constructor = clazz.getDeclaredConstructor();//取消访问检查constructor.setAccessible(true);//创建Singleton类的对象s1Singleton s1 = (Singleton) constructor.newInstance();//创建Singleton类的对象s2Singleton s2 = (Singleton) constructor.newInstance();//判断通过反射创建的两个Singleton对象是否是同一个对象System.out.println(s1 == s2);}
}

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

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

相关文章

C# lock关键字

C# 中的 lock 关键字是用于同步代码块,确保在同一时间内只有一个线程可以执行该代码块。这是解决多线程环境下资源竞争和数据不一致问题的常用手段之一。 lock 关键字通过锁定一个对象来工作,任何线程在尝试进入被 lock 保护的代码块之前,都…

PCIe驱动开发(3)— 驱动设备文件的创建与操作

PCIe驱动开发(3)— 驱动设备文件的创建与操作 一、前言 在 Linux 中一切皆为文件,驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对这个名为“/dev/xxx” (xxx 是具体的驱动文件名字)的文件进行相应的操作即…

VAE论文阅读

在网上看到的VAE解释,发现有两种版本: 按照原来论文中的公式纯数学推导,一般都是了解生成问题的人写的,对小白很不友好。按照实操版本的,非常简单易懂,比如苏神的。但是却忽略了论文中的公式推导&#xff…

信创学习笔记(四),信创之数据库DB思维导图

创作不易 只因热爱!! 热衷分享,一起成长! “你的鼓励就是我努力付出的动力” 一. 信创学习回顾 1.信创内容 信创内容思维导图 2.信创之CPU芯片架构 信创之CPU芯片架构思维导图 3.信创之操作系统OS 信创之操作系统OS思维导图 二. 信创之国产数据库DB思维导图 …

什么是带宽限制,如何影响服务器数据传输?

什么是带宽限制? 带宽限制是指网络连接中的数据传输速率上限,通常以每秒传输的数据量(比特或字节)来衡量。例如,一个服务器的带宽限制为100 Mbps,意味着它在理想情况下每秒最多能传输100兆比特的数据。带宽限制由网络服务提供商或数据中心设…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(四)-无人机系统(UAS)命令与控制(C2)通信用例

引言 本文是3GPP TR 22.829 V17.1.0技术报告,专注于无人机(UAV)在3GPP系统中的增强支持。文章提出了多个无人机应用场景,分析了相应的能力要求,并建议了新的服务级别要求和关键性能指标(KPIs)。…

对某根域的一次渗透测试

前言 两个月之前的一个渗透测试项目是基于某网站根域进行渗透测试,发现该项目其实挺好搞的,就纯粹的没有任何防御措施与安全意识所以该项目完成的挺快,但是并没有完成的很好,因为有好几处文件上传没有绕过(虽然从一个…

Datawhale AI 夏令营 deepfake图像识别-Task02打卡

数据中存在正负类不平衡问题,目前采用直接每次随机抽取和负类数量相同的正类作为训练集。为了更随机,应该每次都随机选取1:1的正负类,然后加大训练量?目前更换了更好的基础模型,还在跑

Vue3项目基于Axios封装request请求

在 Vue 3 的项目开发中,使用 Axios 进行 HTTP 请求是非常常见的作法,为了更方便开发者更高效的进行代码编写和项目的维护,可以通过再次封装 Axios 来实现。 在本文中,博主将详细指导你如何在自己的 Vue 3 项目中使用 Axios 二次封…

浅谈Git

一:什么是 git git一种开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 下图是 git 的一个工作流程简图 二:什么是 分布/集中式版本控制系统 软件开发过程中,要解决多人协作的问题,需要…

Java之split 方法

方法的工作原理 split 方法首先检查字符串中是否存在指定的分隔符。如果存在,它会在每个分隔符处切割字符串,生成一个新的字符串数组。如果字符串中没有指定的分隔符,或者分隔符是非空字符但在字符串中不存在,则 split 方法会返回…

基于LSTM及其变体的回归预测

1 所用模型 代码中用到了以下模型: 1. LSTM(Long Short-Term Memory):长短时记忆网络,是一种特殊的RNN(循环神经网络),能够解决传统RNN在处理长序列时出现的梯度消失或爆炸的问题。L…

挂耳式蓝牙耳机什么牌子好?这五款综合表现遥遥领先

为什么这几年开放式耳机受到了越来越多消费者的喜爱?我想是因为它全方位的弥补了入耳式耳机堵塞耳朵、不够安全健康的缺陷,真正做到了安全性与舒适性兼得。那么刚入坑开放式耳机的小白该如何挑选一款品质较高的开放式耳机呢?挂耳式蓝牙耳机什…

微服务中的 “负载均衡策略” 简介

微服务中的负载均衡策略是确保系统高可用性和高性能的关键技术之一。这些策略通过合理地将请求分配给多个服务实例,以实现资源的优化利用和请求的均衡处理。 本文选取以下几种常见的微服务负载均衡策略,并对其功能作简要介绍: 轮询&#xf…

2024年公路水运工程施工企业安全生产管理人员证模拟考试题库及公路水运工程施工企业安全生产管理人员理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年公路水运工程施工企业安全生产管理人员证模拟考试题库及公路水运工程施工企业安全生产管理人员理论考试试题是由安全生产模拟考试一点通提供,公路水运工程施工企业安全生产管理人员证模拟考试题库是…

Qt 实战(7)元对象系统 | 7.3、QMetaObject

文章目录 一、QMetaObject1、什么是QMetaObject?2、QMetaObject提供的主要功能3、如何使用QMetaObject?3.1、获取类的元对象3.2、动态调用方法3.3、读写属性 4、高级应用4.1、动态创建对象4.2、利用QMetaObject进行插件管理 5、总结 前言: 在…

模块化和包管理工具

一,模块化 1.定义 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 ,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用 2.模块化…

博客最细 STM32CubeProgrammer 使用教程(学不会来找我)

前言:编写不易,仅供参考学习,请勿搬运 文章相关介绍 本篇主要是介绍 STM32CubeProgrammer 烧录软件的使用过程,随着ST开发生态已经完成闭环,(STM32CubleMX配置代码 STM32IDE写代码 STM32CubeProgramm…

【代码随想录_Day30】1049. 最后一块石头的重量 II 494. 目标和 474.一和零

Day30 OK,今日份的打卡!第三十天 以下是今日份的总结最后一块石头的重量 II目标和一和零 以下是今日份的总结 1049 最后一块石头的重量 II 494 目标和 474 一和零 今天的题目难度不低,掌握技巧了就会很简单,尽量还是写一些简洁代…

【时时三省】tessy 集成测试:小白入门指导手册

目录 1,创建集成测试模块且分析源文件 2,设置测试环境 3,TIE界面设置相关函数 4,SCE界面增加用例 5,编辑数据 6,用例所对应的测试函数序列 7,添加 work task 函数 8,为测试场景添加函数 9,为函数赋值 10,编辑时间序列的数值 11,执行用例 12,其他注意事项…