Java设计模式(八)— 单例模式3

news2024/11/23 12:59:50

系列文章目录

单例模式之静态内部类
单例模式之枚举方式
单例模式之JDK源码分析


文章目录

  • 系列文章目录
  • 前言
  • 一、单例—静态内部类
    • 1.静态内部类案例
    • 2.静态内部类优缺点
  • 二、单例—枚举方式
    • 1.枚举方式案例
    • 2.枚举方式优缺点
  • 三、单例—JDK源码分析
    • 1.JDK源码分析
  • 四、单例模式注意事项和细节说明
  • 总结


前言

Hello,小伙伴们,欢迎来到柚子的博客~让我们一起成长吧o( ̄▽ ̄)ブ


提示:以下是本篇文章正文内容,下面案例可供参考

一、单例—静态内部类

1.静态内部类案例

代码如下(示例):

//静态内部类完成
class Singleton {
	private static volatile Singleton instance;
	//构造器私有化
	private Singleton() {}
	//写一个静态内部类,该类中有一个静态属性 Singleton
	private static class SingletonInstance {
		private static final Singleton INSTANCE = new Singleton();
	}
	//提供一个静态的公有方法,直接返回SingletonInstance.INSTANCE
	public static Singleton getInstance() {
		return SingletonInstance.INSTANCE;
	}
}

类被装载的时候,类里面的静态内部类也是会被装载的,而且线程是安全的

特点:
(1)当外部类被装载的时候,静态内部类也会被装载。
(2)当静态内部类在调 getInstance方法时,会导致静态内部类的装载,而且只会装载一次,而且装载的时候线程是安全的,所以可以达到懒加载+安全的效果。
(3)final方法进内嵌,但是方法太大的时候反而会降低性能,在装载类的时候,使用了jvm底层提供的装载机制,保证了初始化是安全的。

2.静态内部类优缺点

(1)这种方式采用了类装载的机制来保证初始化实例时只有一个线程。
(2)静态内部类方式在Singleton类被装载时并不会立即实例化,而且在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。
(3)类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。
(4)优点:避免了线程不安全,利用静态内部类特点实现延迟加载,效率高。
(5)缺点:会造成内存浪费。
(6)结论:推荐使用

二、单例—枚举方式

1.枚举方式案例

代码如下(示例):

public class SingletonTest08 {
	public static void main(String[] args) {
		Singleton instance = Singleton.INSTANCE;
		Singleton instance2 = Singleton.INSTANCE;
		System.out.println(instance == instance2);
		System.out.println(instance.hashCode());
		System.out.println(instance2.hashCode());
	}
}
enum Singleton {
	INSTANCE;//属性
	public void sayOk() {
		System.out.println("ok~");
	}
}

(1)这是一个枚举系统,里面定义了一个INSTANCE的属性,那这里面也可以提供相应的方法。
(2)枚举类型中的每个属性的类型都是枚举类型的,因此每个属性都是一个单例
使用枚举,可以实现单例。

2.枚举方式优缺点

(1)这借助JDK1.5中添加的枚举来实现单例模式。不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。
(2)这种方式是Effective Java作者Josh Bloch提倡的方式。
(3)结论:推荐使用

三、单例—JDK源码分析

1.JDK源码分析

在我们JDK中,java.lang.Runtime就是经典的单例模式
在这里插入图片描述
静态属性:currentRuntime
静态方法:getRuntime(),把事先创建好的currentRuntime返回
构造方法:Runtime(),私有化
使用的是单例模式中的饿汉式,上来就进行创建,避免了多线程的问题。

四、单例模式注意事项和细节说明

(1)单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
(2)当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new。
(3)单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等)


总结

单例模式之静态内部类——推荐使用
单例模式之枚举方式——推荐使用


╭◜◝ ͡ ◜◝╮
( ˃̶͈◡˂ ̶͈ )感觉有用的话,欢迎点赞评论呀!
╰◟◞ ͜ ◟◞╯

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

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

相关文章

Java同步容器和并发容器

同步容器 在 Java 中,同步容器主要包括 2 类: Vector、Stack、HashTable Vector 实现了 List 接口,Vector 实际上就是一个数组,和 ArrayList 类似,但是 Vector 中的方法都是 synchronized 方法,即进行了同…

大型企业的知识库是什么结构的?真的有用吗?

大型企业的知识库是指建立在企业内部的一个包含各种知识和信息的系统,它可以帮助企业更好地管理和利用企业内部的知识资源,提高企业的创新能力和竞争力。 知识库的结构和内容包括以下几个方面 一、知识分类和标签化 在建立知识库之前,企业…

哪款佩戴舒适的蓝牙耳机好?公认佩戴舒适度高的蓝牙耳机推荐

现如今,蓝牙耳机越多人使用,不同于有线耳机,蓝牙耳机更为方便,没有线束的困扰,走到哪也不用带上手机一起,特别便利。然而,随着蓝牙耳机市场的扩大,各种类型各种样式的耳机五花八门&a…

骨传导蓝牙耳机怎么用,分享几款不错的骨传导耳机

骨传导技术是利用振动将声音转化为不同频率的机械振动,通过人的颅骨、骨迷路、内耳淋巴液传递、螺旋器、听神经、听觉中枢来传递声波。相比传统耳机,它在运动时使用,不会损伤到我们的听力。它不需要入耳佩戴,佩戴更舒适健康。 骨传…

悄悄告诉你有什么免费的ai绘画工具

是不是每次看到一幅美丽的画作,你都会心生羡慕,想要自己也能创造出那样的艺术品?别担心,现在有了ai绘画工具,你也可以轻松成为一位小小画家!这些神奇的工具不仅能够帮助你发挥创造力,还能让你玩…

SQL Server 中count方法和case when语句配合使用中的问题

概要 我们在使用SQL Server生成报表统计数据的时候,经常使用sum,count等聚合函数,有时候还会配合case when语句一边执行过滤操作,一边进行聚合。 本文介绍一个在使用中的常见的错误和解决方法。 设计和实现 下面是一张订单记录…

【链表复习】C++ 链表复习及题目解析 (2)

目录 牛客 CM11 链表分割 牛客 OR36 之链表的回文结构 Leetcode 160. 相交链表 LeetCode 141. 环形链表 LeetCode 138. 复制带随机指针的链表 本文继续延续前文,为大家带来几道经典的链表中等难度的题目。 牛客 CM11 链表分割 现有一链表的头指针 ListNode* p…

探索iOS之Metal标准库

Metal标准库包括&#xff1a;通用函数、整型函数、关系函数、数学函数、矩阵运算、SIMD运算、几何函数、纹理函数等。接下来让我们走进Metal标准库的世界。 1、通用函数 通用函数在<metal_common>头文件中&#xff0c;T为scalar或vector的浮点类型。如下表所示&#xf…

公司最大的内卷,是OKR驱动

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 去年5月&#xff0c;以善用OKR独步江湖的Google公司宣布将对 Google 员工的绩效管理方式进行改革——Google 开始使用一种名为 GRAD 的新绩效评估流程。据了解&#xff0c;这一调整主要是基于员工对谷…

集权设施管理-AD域安全策略(二)

活动目录&#xff08;AD&#xff09;凭借其独特管理优势&#xff0c;从众多企业管理服务中脱颖而出&#xff0c;成为内网管理中的佼佼者。采用活动目录来管理的内网&#xff0c;称为AD域。 了解AD域&#xff0c;有助于企业员工更好地与其它部门协作&#xff0c;同时提高安全意…

算法练习5:二进制字符串前缀一致的次数

给你一个长度为 n 、下标从 1 开始的二进制字符串&#xff0c;所有位最开始都是 0 。我们会按步翻转该二进制字符串的所有位&#xff08;即&#xff0c;将 0 变为 1&#xff09;。 给你一个下标从 1 开始的整数数组 flips &#xff0c;其中 flips[i] 表示对应下标 i 的位将会在…

docker容器 - 卷(volume)- 挂载

目录 参考文档&#xff1a;Volumes | Docker Documentation 什么是卷&#xff08;volume&#xff09;&#xff1f; 什么是挂载&#xff0c;它的作用是什么&#xff1f; 一台机器里的多个容器之间共享数据&#xff08;使用挂载&#xff09; 首先我们可以使用最简单的docker …

预训练、微调和上下文学习

最近语言模型在自然语言理解和生成方面取得了显著进展。这些模型通过预训练、微调和上下文学习的组合来学习。在本文中将深入研究这三种主要方法&#xff0c;了解它们之间的差异&#xff0c;并探讨它们如何有助于语言模型的学习过程。 预训练 预训练&#xff08;Pre-training&…

RadEx Pro处理电火花数据操作步骤(上)

最近单位采集了很多的电火花测线&#xff0c;同事在使用GeoSuite AllWorks 2022R1处理这些测线的时候&#xff0c;发现二次波对地层辨识和划分干扰比较严重。GeoSuite AllWorks 压制二次波的能力有限&#xff0c;有人推荐我们试一试地震处理软件RadEx Pro。 两个中文文档“RadE…

7--Gradle进阶 - settings.gradle的文件说明

7--Gradle进阶 - settings.gradle的文件说明 前言 介绍 settings.gradle 文件之前&#xff0c;先来说明一下&#xff0c;settings.gradle 主要是用来多模块工程使用的。 所以我们先来创建一个多模块的工程。 多模块工程创建 1. 创建 root 工程 1.1 配置本地 Gradle 1.2 配置依赖…

一口总结了金九银十(P5-P7 级)1000 多道 Java 面试题,20+ 大厂必考点及 Java 面试框架知识点

Java 面试 “金九银十”这个字眼对于程序员应该是再熟悉不过的了&#xff0c;每年的金九银十都会有很多程序员找工作、跳槽等一系列的安排。说实话&#xff0c;面试中 7 分靠能力&#xff0c;3 分靠技能&#xff1b;在刚开始的时候介绍项目都是技能中的重中之重&#xff0c;它…

微服务架构基础--第2章初识SpringBoot

第2章初识SpringBoot 一.预习笔记 1.SpringBoot的定义&#xff1a; SpringBoot是由Pivotal团队提供的一个全新框架&#xff0c;是为了简化Spring应用的初始搭建过程和开发过程。 2.SpringBoot的优点 1&#xff09;可快速的构建独立Spring应用程序 2&#xff09;内嵌Servle…

​DMBOK知识梳理for CDGA/CDGP——第六章 数据存储与操作(附常考知识点)

第六章 数据存储与操作 第六章在CDGA|CDGP考试中的分值占比较少&#xff0c;知识点比较密集&#xff0c;主要考点包括&#xff1a;数据存储与操作的定义、目标、数据库管理员&#xff08;DBA&#xff09;的角色定位及类型、数据处理的类型ACID和BASE的区别、数据库环境、活动、…

探索工业智能检测,基于轻量级YOLOv5s开发构建焊接缺陷检测识别系统

前面也有讲过将智能模型应用和工业等领域结合起来是有不错市场前景的&#xff0c;比如&#xff1a;布匹瑕疵检测、瓷砖瑕疵检测、PCB缺陷检测等等&#xff0c;在工业领域内也有很多可为的方向&#xff0c;本文的核心目的就是想要基于目标检测模型来开发构建焊接缺陷检测模型&am…

基于opencv测量图片中物体的尺寸(matlab实现)

1、引言 问题重述 已知书本上右下角放一枚一元人民币&#xff08;直径2.5厘米&#xff09;&#xff0c;请利用计算机视觉技术预测图片中目标的实际尺寸。 1.预测图片中书本的长与宽&#xff08;单位&#xff1a;厘米&#xff09;。 2.预测书本右上方用铅笔画的圆圈的外圆直径…