[JAVAee]单例模式

目录

单例模式的含义

饿汉模式

注意事项

懒汉模式

单线程版本

多线程版本

多线程改进版本(推荐)

注意事项


单例模式的含义

解析这个名词:

单例中的单,指的是单个,一个的意思

而例,是实例的意思,实例也就是通常所说的对象.

合起来就是,只能有一个实例\对象的模式.

当然这是对于某一个类来说的.

在使用了这个模式后,我们就不能一直new一直new来创建多个对象了.会被这个模式下的java语法所限制,从而达到某个类只能含有一个类的情况.

单例模式的具体实现方法,对应的也分成饿汉模式懒汉模式和其他方法,这里着重介绍这两种.

饿汉模式

在创建类的时候顺手就把实例创建好(特点),并且把构造方法使用private修饰使用户在类外无法创建实例.达到有且只有一个实例的效果.

public static class Singleton{private static Singleton instance = new Singleton();//private修饰的且staticprivate Singleton(){};public static Singleton getInstance(){//返回的类型为自定义类型return instance;}}

注意事项

类中创建的实例需要使用类名修饰,是一个自定义类型.

使用InputContext类下的类方法getInstance方法返回类中唯一的实例,使其可以在类外使用

③唯一的实例是需要被static修饰,原因是:

当在类外调用类方法的时候,可以通过创建一个新的实例通过这个新的实例调用其中的类方法.或者直接调用这个类的类方法(即静态方法).这一来就规定了,getInstance方法只有通过被static修饰在类外直接调用的这种方法.

而静态的方法,即类方法.是不可以访问非静态的实例或者变量的.这时候就需要我们把实例再加上static关键字,使其能够被返回

还要注意的是,为了达到唯一这个关键点.我们需要将其构造方法挂上private关键字来修饰,使其不能被在类外调用.

饿汉模式的特点为,在创建类的时候就已经把实例创建好了.不管后面的程序有没有使用到这个实例.

在多线程的模式下,是线程安全的.因为饿汉模式中只有读指令

懒汉模式

在getInstance方法中判断实例有无创建,如果第一个实例还没有创建则创建第一个实例.

能够放置后续代码没有使用这个实例,而却先前创建出来.浪费了空间资源

单线程版本

public static class Singleton1{private static Singleton1 instance = null;private Singleton1(){};public static Singleton1 getInstance(){if(instance == null){//在调用的时候才创建实例instance = new Singleton1();}return instance;}}

多线程版本

只是在单线程的基础上,加上synchronized关键字,对getinstance方法上锁

对getInstance方法上锁,防止多线程的环境下可能创建出多个实例的情况.

public static class Singleton2{private static Singleton2 instance = null;private Singleton2(){};public static synchronized Singleton2 getInstance(){//上锁if(instance == null){instance = new Singleton2();}return instance;}}

多线程改进版本(推荐)

在上面的基础上,将锁放到了内部.

对于单例模式的多线程下,会出现线程安全问题的只有实例需要被创建但还没创建出的情况.

将锁放到getinstance方法外面,再每次调用getinstance方法的时候都会进行上锁和销毁锁的操作.

可是锁的创建与销毁也是需要一定的开销的.

为了尽量避免这种开销,我们可以将锁放到里面.使用两个if语句来判断.外面的if通常适用于,实例已经创建后的状况下会使用次数比较多.而对于第二个if语句,只会在第一次创建实例的时候进入,

但在内部上锁,就会出现线程的内存可见性的问题,所以需要volatile关键字来修饰实例.

public static class Singleton3{private static volatile Singleton3 instance = null;private Singleton3(){};public static Singleton3 getInstance(){if(instance == null){synchronized (Singleton3.class){if(instance == null){instance = new Singleton3();}}}return instance;}}

注意事项

①只有在类外调用getInstance方法的时候才创建实例,在一定程度上避免了资源的浪费

多线程环境下,饿汉模式并非天然就是线程安全的.因为其包含了读操作也包含有写操作.

多线程的环境下,使用饿汉模式最好使用改进后的版本.在合适的位置使用synchronized关键字上锁,并且使用volatile修饰实例.减少了上锁与销毁锁的次数,节约了资源,也有更高效的效率.

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

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

相关文章

【RabbitMQ(day1)】RabbitMQ的概述和安装

入门RabbitMQ 一、RabbitMQ的概述二、RabbitMQ的安装三、RabbitMQ管理命令行四、RabbitMQ的GUI界面 一、RabbitMQ的概述 MQ(Message Queue)翻译为消息队列,通过典型的【生产者】和【消费者】模型,生产者不断向消息队列中生产消息&…

【DDD】业务领域定义

文章目录 前言一、什么是业务子领域?二、子领域的类型有哪些?2.1、核心子领域2.2、通用子领域2.3、支撑子领域 三、子领域差异对比3.1、竞争优势比较3.2、复杂性比较3.3、易变性比较3.4、实时策略比较 总结 前言 一个业务领域是一个公司的主要活动领域的…

解决 “无法将 ‘npm‘ 项识别为 cmdlet、函数、脚本文件或可运行程序的名称“ 错误的方法

系列文章目录 文章目录 系列文章目录前言一、错误原因:二、解决方法:三、注意事项:总结 前言 在使用 npm 进行前端项目开发时,有时会遇到错误信息 “无法将 ‘npm’ 项识别为 cmdlet、函数、脚本文件或可运行程序的名称”&#x…

hive中补充月份和日期,使得月份和日期连续

补充月份,这个需求是计算每个小组前三个月的平均产能,前三个月指的是都是自然月,比如现在是2023年7月,所以现在计算的前三个月的平均产能就是2023年4月到6月的平均产能,但是这些月份可能不是连续的 方法一:…

vue之vue-keyboard组件

功能描述 业务键盘组件,提供给业务开发继承,它的父级组件为vue-base #方法 手工触发输入事件 change: function(text); 接受输入 accept: function(text); 显示屏幕键盘 show(e, current, layout); 隐藏屏幕键盘 hide: function(); 聚焦输入 focusInput($event, kbId, lay…

redis(11):springboot中使用redis

1 创建springboot项目 2 创建pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:/…

jupyter常用的魔法命令合集

下面是 Jupyter Notebook 中一些常用的魔术命令&#xff1a; 行魔术命令&#xff08;Line Magics&#xff09;&#xff1a; %run&#xff1a;运行指定的 Python 脚本。%load&#xff1a;将外部脚本加载到单元格中。%whos&#xff1a;列出当前命名空间中的变量和它们的信息。%ti…

vue3+Luckysheet实现表格的在线预览编辑(electron可用)

前言&#xff1a; 整理中 官方资料&#xff1a; 1、github 项目地址https://github.com/oy-paddy/luckysheet-vue-importAndExport/tree/master/https://github.com/oy-paddy/luckysheet-vue-importAndExport/tree/master/ 2、xlsx vue3 json数据导出excel_vue3导出excel_羊…

【SpirngCloud】分布式事务解决方案

【SpirngCloud】分布式事务解决方案 文章目录 【SpirngCloud】分布式事务解决方案1. 理论基础1.1 CAP 理论1.2 BASE 理论1.3 分布式事务模型 2. Seata 架构2.1 项目引入 Seata 3. 强一致性分布式事务解决方案3.1 XA 模式3.1.1 seata的XA模式3.1.2 XA 模式实践3.1.3 总结 4. 最终…

React AntDesign表批量操作时的selectedRowKeys回显选中

不知道大家是不是在AntDesign的某一个列表想要做一个批量导出或者操作的时候&#xff0c;发现只要选择下一页&#xff0c;即使选中的ids 都有记录下面&#xff0c;但是就是不回显 后来问了chatGPT&#xff0c;对方的回答是&#xff1a; 在Ant Design的DataTable组件中&#xf…

什么是框架?为什么要学框架?

一、什么是框架 框架是整个或部分应用的可重用设计&#xff0c;是可定制化的应用骨架。它可以帮开发人员简化开发过程&#xff0c;提高开发效率。 项目里有一部分代码&#xff1a;和业务无关&#xff0c;而又不得不写的代码>框架 项目里剩下的部分代码&#xff1a;实现业务…

基于C++的QT基础教程学习笔记

文章目录&#xff1a; 来源 教程社区 一&#xff1a;QT下载安装 二&#xff1a;注意事项 1.在哪里写程序 2.如何看手册 3.技巧 三&#xff1a;常用函数 1.窗口 2.相关 3.按钮 4.信号与槽函数 5.常用栏 菜单栏 工具栏 状态栏 6.铆接部件 7.文本编辑 8…

Docker Compose(九)

一、背景&#xff1a; 对于现代应用来说&#xff0c;大多数都是通过很多的微服务互相协同组成一个完整的应用。例如&#xff0c;订单管理、用户管理、品类管理、缓存服务、数据库服务等&#xff0c;他们构成了一个电商平台的应用。而部署和管理大量的服务容器是一件非常繁琐的事…

【时间复杂度】

旋转数组 题目 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 /* 解题思路&#xff1a;使用三次逆转法&#xff0c;让数组旋转k次 1. 先整体逆转 // 1,2,3,4,5,6,7 // 7 6 5 4 3 2 1 2. 逆转子数组[0, k - 1] // 5 6 7 4 3…

疲劳驾驶检测和识别2:Pytorch实现疲劳驾驶检测和识别(含疲劳驾驶数据集和训练代码)

疲劳驾驶检测和识别2&#xff1a;Pytorch实现疲劳驾驶检测和识别(含疲劳驾驶数据集和训练代码) 目录 疲劳驾驶检测和识别2&#xff1a;Pytorch实现疲劳驾驶检测和识别(含疲劳驾驶数据集和训练代码) 1.疲劳驾驶检测和识别方法 2.疲劳驾驶数据集 &#xff08;1&#xff09;疲…

【贪心算法】334. 递增的三元子序列

334. 递增的三元子序列 解题思路 找到的递增序列 不一定是连续的固定第一个数first 然后开始向后找第二个数second要求second 大于 first 找到之后 向后找第三个数third 找到 返回true如果third < first 那么更新first third 重新找如果只是third > first 更新second …

【MyBatis】总结

1.xml映射文件都会写一个Dao接口与之对应&#xff0c;Dao工作原理是什么&#xff0c;Dao接口里的方法参数不同时&#xff0c;方法能重载么 Dao接口即Mapper接口&#xff0c;接口的全限名&#xff0c;映射文件中的namespace的值&#xff0c; 接口的方法名就是映射文件中Mapper的…

MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点6:MySQL Enterprise Monitor之Query Analyzer

文章目录 MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点6&#xff1a;MySQL Enterprise Monitor之Query AnalyzerMySQL Enterprise Monitor之Query AnalyzerQuery Response Time index (QRTi)例题例题1: Query Analyzer答案与解析1 参考 【免责声明】文章仅供学习交流&#x…

vue中如何通过webpack-bundle-analyzer打包分析工具进行配置优化

vue中随着项目的不断功能迭代和开发&#xff0c;项目文件越来越多&#xff0c;项目的打包文件也越来越大。如何对打包文件进行分析优化&#xff0c;减小打包文件大小呢&#xff1f;可以通过webpack-bundle-analyzer 这个打包分析工具进行解决。 1、webpack-bundle-analyzer的安…

学生管理系统-07打包与上线

一、项目架构 vue的项目必须要进行打包,并部署在nginx服务器上的 二、vue的打包 1、修改vue.cofing.js文件 在该文件中添加publicPath属性,值为./ const { defineConfig } = require(@vue/cli-service) module.exports = defineConfig({ transpileDependencies: true, p…