Java设计模式-单例模式

单例模式

1.单例模式含义

单例模式就是保证一个类仅有一个实例,并提供一个访问它的全局访问点。

其实单例模式很好理解,当我们new一个对象实例的时候,这个对象会被放到一个内存中,当我们再次new同一个对象的实例的时候,此时系统就又会为我们新创建的这个对象分配一个新的内存。这就是普通的对象创建方式,单例模式呢就是,无论我们创建多少次对象,所有的创建出来的对象,都指向同一个内存,都是同一个对象。

2.代码示例

2.1Singleton类

Singleton类是目标类,就是我们要new的对象

public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance(){if (instance == null) {instance = new Singleton();}return instance;}
}

2.2测试类

public class MainApp {public static void main(String[] args) {Singleton instance1 = Singleton.getInstance();Singleton instance2 = Singleton.getInstance();System.out.println("instance1的内存地址:" + instance1);System.out.println("instance2的内存地址:" + instance2);}
}

运行结果

instance1的内存地址:com.dalei.singleton.Singleton@1b6d3586
instance2的内存地址:com.dalei.singleton.Singleton@1b6d3586

从运行结果可以看到,虽然我们创建了两个Singleton对象的实例,但是这两个实例所指向的内存地址是一模一样的,也就是说这两个实例是相等的,是同一个。

3.总结

单例模式的目的就是为了让一个类自始至终都仅保持唯一的一个实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

单例模式有两种初始化方式,一种饿汉式,一种懒汉式

  • 饿汉式:就是在类被加载的时候就将自己实例化出来

    饿汉式使用,会提前占用系统资源,但是不会出现多线程问题,因为线程工作前,这个单例对象已经被创建好了。

  • 懒汉式:就是在第一次引用这个类的时候,才将自己实例化

    懒汉式使用,不会提前占用系统资源,但是会出现多线程问题,要做好线程并发控制,否则对象就会创建多个出来。

这两种实例化的方式,区别就是加载时机不同。

综上,单例模式是为了让我们在任何时候任何地方引用到的都是同一个对象,如果想要实现这个效果,那单例模式就是很好的解决方法。不过使用单例模式的时候要注意避免多线程并发问题,解决多线程并发的方法很多种,加锁,使用枚举等等,此处不做深入讨论。

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

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

相关文章

ES6模块化与异步编程高级用法

目录 ES6 模块化 1、什么是 ES6 模块化规范 2、在 node.js 中体验 ES6 模块化 3、ES6 模块化的基本语法 Promise 1. 回调地狱 2、Promise 的基本概念 3、基于回调函数按顺序读取文件内容 4.、基于 then-fs 读取文件内容 4.1 then-fs 的基本使用 4.2 .then() 方法的特…

ZooKeeper原理剖析

1.ZooKeeper简介 ZooKeeper是一个分布式、高可用性的协调服务。在大数据产品中主要提供两个功能: 帮助系统避免单点故障,建立可靠的应用程序。提供分布式协作服务和维护配置信息。 2.ZooKeeper结构 ZooKeeper集群中的节点分为三种角色:Le…

SSH客户端连接远程服务器

目录 一、什么是客户端连接远程服务器 二、什么是服务端连接远程服务器 三、查看网络信息 1、图形程序查看网络信息 2、命令查看网络信息 四、SSH客户端(Linux) 五、SSH客户端(windows) 六、SSH远程服务器 一、什么是客户…

75、简述你对RPC、RMI的理解

简述你对RPC、RMI的理解 RPC:在本地调用远程的函数,远程过程调用,可以跨语言实现 httpClient RMI:远程方法调用,java中用于实现RPC的一种机制,RPC的java版本,是J2EE的网络调用机制&#xff0c…

git如何撤销commit(未push)

文章目录 前言undo commitreset current branch to here Undo Commit,Revert Commit,Drop Commit的区别 是否删除对代码的修改是否删除Commit记录是否会新增Commit记录Undo Commit不会未Push会,已Push不会不会Revert Commit会不会会Drop Com…

jQuery.print打印插件的使用方法

网站新闻内容页面,想只打印新闻内容区域,其他区域不打印,使用了jQuery.print插件,插件下载地址:GitHub - DoersGuild/jQuery.print: Easy to use, Element Printing Plugin for jQuery 插件下载地址:https:…

vue 3.0 如何加载图片

.logo { background: url(~/assets/images/logo.svg) no-repeat center center/contain; width: 117px; height: 24px; margin: 0 20px; } <a class"logo" href"#"></a> 比较实用的书写方式

汽车销售数据可视化分析实战

1、任务 市场需求&#xff1a;各年度汽车总销量及环比&#xff0c;各车类、级别车辆销量及环比 消费能力/价位认知&#xff1a;车辆销售规模及环比、不同价位车销量及环比 企业/品牌竞争&#xff1a;各车系、厂商、品牌车销量及环比&#xff0c;市占率及变化趋势 热销车型&…

OBS 基础 之 使用到的坐标体系 及转换

目录 一、画布坐标 1、画布宽高 2、设置LOGO位置 二、预览窗口坐标

python多线程排查

问题 公司服务总是莫名其妙的cpu饱满排查了代码中的定时任务&#xff0c;排除之后仍经常出现类似问题。是时候debug了 排查过程 cpu劣化是一个过程&#xff0c;cpu持续增长到60%&#xff0c;然后突然服务雪崩不服务了。排查下来看sleep的物理线程和cpu增长的幅度一致 那么…

【Rust 基础篇】Rust 多线程:并发编程的艺术

导言 多线程是现代计算机编程中的重要概念&#xff0c;它允许程序同时执行多个任务&#xff0c;充分利用多核处理器的性能优势。在 Rust 中&#xff0c;多线程编程也得到了很好的支持&#xff0c;通过标准库提供的 std::thread 模块可以方便地创建和管理线程。本篇博客将详细介…

vue3+pinia的使用,刷新后不丢数据

前言&#xff1a; 好用的状态管理器&#xff0c;vue3中出来的pinia&#xff0c;相比较vuex来说&#xff0c;更加轻便&#xff0c;使用也更方便。 官方文档&#xff1a;点我 github地址&#xff1a;点我 pinia与vuex相比较优点&#xff1a; pinia 是轻量级状态管理工具&#x…

hadoop安全保护机制(kerberos + ldap)

信息安全理论&#xff1a; CIA模型&#xff1a;机密性、完整性和可用性 CIA模型能够帮助建议一些信息安全原则&#xff0c;但该模型并不是一个需要严格遵守的规则 hadoop平台可能设计多个CIA模型组件&#xff0c;也kennel一个也不涉及 机密性&#xff1a; 信息只应该被期望的…

探索AI图像安全,助力可信AI发展

探索AI图像安全&#xff0c;助力可信AI发展 0. 前言1. 人工智能发展与安全挑战1.1 人工智能及其发展1.2 人工智能安全挑战 2. WAIC 2023 多模态基础大模型的可信 AI2.1 WAIC 2023 专题论坛2.2 走进合合信息 3. AI 图像安全3.1 图像篡改检测3.2 生成式图像鉴别3.3 OCR 对抗攻击技…

Vis相关的期刊会议

中国计算机学会推荐国际学术会议和期刊目录 文档&#xff0c; 下载 link&#xff1a;CCF推荐国际学术刊物目录-中国计算机学会 一.可视化方向文章 1.IEEE VIS&#xff0c;是由 IEEE Visualization and Graphics Technical Committee(VGTC) 主办的数据可视化领域的顶级会议&a…

LeetCode_模拟_中等_874.模拟行走机器人

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 机器人在一个无限大小的 XY 网格平面上行走&#xff0c;从点 (0, 0) 处开始出发&#xff0c;面向北方。该机器人可以接收以下三种类型的命令 commands &#xff1a; -2 &#xff1a;向左转 90 度-1 &#xf…

【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 17 日论文合集)

文章目录 一、检测相关(5篇)1.1 TALL: Thumbnail Layout for Deepfake Video Detection1.2 Cloud Detection in Multispectral Satellite Images Using Support Vector Machines With Quantum Kernels1.3 Multimodal Motion Conditioned Diffusion Model for Skeleton-based Vi…

【Linux】自动化构建工具-make/Makefile详解

前言 大家好吖&#xff0c;欢迎来到 YY 滴 Linux系列 &#xff0c;热烈欢迎&#xff01;本章主要内容面向接触过Linux的老铁&#xff0c;主要内容含 欢迎订阅 YY 滴Linux专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 订阅专栏阅读&#xff1a;YY的《…

深度学习——LSTM解决分类问题

RNN基本介绍 概述 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种深度学习模型&#xff0c;主要用于处理序列数据&#xff0c;如文本、语音、时间序列等具有时序关系的数据。 核心思想 RNN的关键思想是引入了循环结构&#xff0c;允许…

7.21一日总结

1.redux中action传参 a.传参 在时间中,第二个参数就是传递的值,num就是传递的参数 onClick{()>{store.dispatch({type:del,num:1})}} b.接收参数 const reducer function (state { ...data }, action) {switch (action.type) {case "del":console.log(action.n…