设计模式-单例模式(懒汉式)
1. 概念
- 保证一个类只有一个实例
- 并为该实例提供一个全局唯一的访问节点
2. 懒汉式-方式一
2.1 代码示例(方式一)
示例
public class Singleton03 {/*** 构造器私有化*/private Singleton03() {}/*** 成员变量*/private static Singleton03 INSTANCE;/*** 对外提供公有的静态方法*/public static Singleton03 getInstance() {// 用到才加载if (INSTANCE == null) {INSTANCE = new Singleton03();}return INSTANCE;}
}
public class SingletonTest03 {public static void main(String[] args) {Singleton03 instance = Singleton03.getInstance();Singleton03 instance1 = Singleton03.getInstance();System.out.println(instance == instance1);System.out.println("instance.hashCode= " + instance.hashCode());System.out.println("instance1.hashCode= " + instance1.hashCode());}
}
2.2 优缺点(方式一)
- 起到了Lazy Loading的效果,但是只能在单线程下使用。
- 如果在多线程下,一个线程进入了if(singleton==null)判断语句块,还未来得及
往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。所以
在多线程环境下不可使用这种方式。
2.3 结论(方式一)
- 线程不安全,在实际开发中,不要使用这种方式。
3. 懒汉式-方式二
3.1 代码示例(方式二)
示例
public class Singleton04 {/*** 构造器私有化*/private Singleton04() {}/*** 成员变量*/private static Singleton04 INSTANCE;/*** 对外提供公有的静态方法*/public static synchronized Singleton04 getInstance() {// 加入同步代码,解决线程不安全问题if (INSTANCE == null) {INSTANCE = new Singleton04();}return INSTANCE;}
}
public class SingletonTest04 {public static void main(String[] args) {Singleton04 instance = Singleton04.getInstance();Singleton04 instance1 = Singleton04.getInstance();System.out.println(instance == instance1);System.out.println("instance.hashCode= " + instance.hashCode());System.out.println("instance1.hashCode= " + instance1.hashCode());}
}
3.2 优缺点(方式二)
- 解决了线程不安全问题。
- 效率太低了,每个线程在想获得类的实例时候,执行getinstance()方法都要进行同步。而其实这个方法只执行一次实例化代码就够了,后面的想想获得该类实例,直接return就行了。方法进行同步效率太低。
3.3 结论(方式二)
- 线程安全,但效率太低,在实际开发中,不推荐使用这种方式。
4. 懒汉式-方式三
4.1 代码示例(方式三)
示例
public class Singleton05 {private Singleton05() {}private static Singleton05 INSTANCE;public static Singleton05 getInstance() {if (INSTANCE == null) {synchronized (Singleton05.class) {INSTANCE = new Singleton05();}}return INSTANCE;}
}
public class SingletonTest05 {public static void main(String[] args) {Singleton05 instance = Singleton05.getInstance();Singleton05 instance1 = Singleton05.getInstance();System.out.println(instance == instance1);System.out.println("instance.hashCode= " + instance.hashCode());System.out.println("instance1.hashCode= " + instance1.hashCode());}
}
4.2 优缺点(方式三)
- 这种方式,本意是想对第四种实现方式的改进,因为前面同步方法效率太低,改为同步产生实例化的的代码块。
- 但是这种同步并不能起到线程同步的作用。跟方式一实现方式遇到的情形一致,假如一个线程进入了if(singleton==null)判断语句块,还未来来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。
4.3 结论(方式三)
- 线程不安全,在实际开发中,不要使用这种方式
相关文章:
设计模式-单例模式(懒汉式)
1. 概念 保证一个类只有一个实例并为该实例提供一个全局唯一的访问节点 2. 懒汉式-方式一 2.1 代码示例(方式一) 示例 public class Singleton03 {/*** 构造器私有化*/private Singleton03() {}/*** 成员变量*/private static Singleton03 INSTANCE;…...
算法| ss 回溯
39.组合总数46.全排列—478.子集79.单词搜索—1连续差相同的数字—1 39.组合总数 /*** param {number[]} candidates* param {number} target* return {number[][]}*/ // 思路 // dfs传参,传idx, 剩余target // dfs返回: 0 收集,…...
基于R语言绘制-散点小提琴图
原文链接:R语言绘图 | 散点小提琴图 本期教程 写在前面 本期的图形来自发表在Nature期刊中的文章,这样的基础图形在日常分析中使用频率较高。 获得本期教程数据及代码,后台回复关键词:20240405 绘图 设置路径 setwd("You…...
Arduino开发 esp32cam+opencv人脸识别距离+语音提醒
效果图 低于20厘米语音提醒字体变红 Arduino代码 可直接复制使用(修改自己的WIFI) #include <esp32cam.h> #include <WebServer.h> #include <WiFi.h> // 设置要连接的WiFi名称和密码 const char* WIFI_SSID "gumou"; const char* …...
LeNet卷积神经网络
文章目录 简介conv2d网络层的结构 简介 它是最早发布的卷积神经网络之一 conv2d 这个卷积成的参数先进行介绍一下: self.conv1 nn.Conv2d(in_channels3, out_channels10, kernel_size3, stride1, padding1)先看一下in_channels 输入的通道数,out_cha…...
Python常用算法思想--回溯算法思想详解【附源码】
通过回溯算法解决“组合”问题、“排序”问题、“搜索”之八皇后问题、“子集和”之0-1背包问题、字符串匹配等六个经典案例进行介绍: 一、解决“组合”问题 从给定的一组元素中找到所有可能的组合,这段代码中的 backtrack_combinations 函数使用了回溯思想,调用 backtrack…...
Day5-Hive的结构和优化、数据文件存储格式
Hive 窗口函数 案例 需求:连续三天登陆的用户数据 步骤: -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…...
01 计算机网络发展与分类
计算机网络:计算机技术与通信技术的结合。 阶段一:早期网络:ARPAnet。 阶段二:厂商独立发展阶段 阶段三:标准化阶段:ISO,TCP/IP 计算机网络分类 计算机网络分类1:通信子网和资源子网 通信子…...
ubuntu安装sublime3并设置中文
安装Sublime Text 3 在Ubuntu上安装Sublime Text 3可以通过以下步骤进行: 打开终端。 导入Sublime Text 3的GPG密钥: wget -qO- https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add - 添加Sublime Text 3的存储库: …...
python调用阿里云短信配置
1. 新增资质和签名 # 访问地址: https://dysms.console.aliyun.com/domestic/text/qualification2. 静静等待几十分钟~~~ 3. 通过sdk去调用,查看有没有python的sdk https://next.api.aliyun.com/api/Dysmsapi/2017-05-25/SendSms?完整代码 # -*- cod…...
MySQL 8.0.13安装配置教程
写个博客记录一下,省得下次换设备换系统还要到处翻教程,直接匹配自己常用的8.0.13版本 1.MySQL包解压到某个路径 2.将bin的路径加到系统环境变量Path下 3.在安装根目录下新建my.ini配置文件,并用编辑器写入如下数据 [mysqld] [client] port…...
【idea快捷键】idea开发java过程中常用的快捷键
含义win快捷键mac快捷键复制当前行或选定的代码块Ctrl DCommand D通过类名快速查找类Ctrl NCommand N通过文件名快速查找文件Ctrl Shift NCommand Shift N通过符号名称快速查找符号(类、方法等)Ctrl Alt Shift NCommand Shift O跳转到声明C…...
2024年腾讯云GPU云服务器配置价格表(内存/系统盘/地域)
腾讯云GPU服务器是提供GPU算力的弹性计算服务,腾讯云GPU服务器具有超强的并行计算能力,可用于深度学习训练、科学计算、图形图像处理、视频编解码等场景,腾讯云百科txybk.com整理腾讯云GPU服务器租用价格表、GPU实例优势、GPU解决方案、GPU软…...
重构数据访问层-优化数据访问的开发
重新整理了一下过去开发的框架,在准备开发新项目时候,重新整理了一下思路,感觉数据访问层还是很鸡肋。过去几年中,急于完成项目开发和交付,框架都是迭代过来的,虽然满足了开发需求,但是…...
云计算概述报告
以下是一篇论述类文章 文章目录 I. 云计算介绍(1)云计算基本概念(2)云计算基本特征 II. 云计算发展历程(1)云计算的起源(2)云计算的发展阶段 III. 云计算特点(1ÿ…...
C++:线程库的使用
文章目录 Windows和Linux平台的线程线程构造函数模板参数包 最近发现C11的线程库还没有进行总结,因此本篇对于C11当中新增的线程库的一些基本用法进行总结 Windows和Linux平台的线程 在Linux平台下是存在一些原生的线程系统调用的,比如有pthread_creat…...
机器学习模型:决策树笔记
第一章:决策树原理 1-决策树算法概述_哔哩哔哩_bilibili 根节点的选择应该用哪个特征?接下来选什么?如何切分? 决策树判断顺序比较重要。可以使用信息增益、信息增益率、 在划分数据集前后信息发生的变化称为信息增益,…...
20.2k stars项目搭建私人网盘界面美功能全
Nextcloud是一套用于创建网络硬盘的客户端-服务器软件。其功能与Dropbox相近,但Nextcloud是自由及开放源代码软件,每个人都可以在私人服务器上安装并执行它。 GitHub数据 20.2k stars561 watching3.2k forks 开源地址:https://github.com/ne…...
卷积篇 | YOLOv8改进之引入全维度动态卷积ODConv | 即插即用
前言:Hello大家好,我是小哥谈。ODConv是一种关注了空域、输入通道、输出通道等维度上的动态性的卷积方法,一定程度上讲,ODConv可以视作CondConv的延续,将CondConv中一个维度上的动态特性进行了扩展,同时了考虑了空域、输入通道、输出通道等维度上的动态性,故称之为全维度…...
Pytorch实用教程:torch.from_numpy(X_train)和torch.from_numpy(X_train).float()的区别
在PyTorch中,torch.from_numpy()函数和.float()方法被用来从NumPy数组创建张量,并可能改变张量的数据类型。两者之间的区别主要体现在数据类型的转换上: torch.from_numpy(X_train):这行代码将NumPy数组X_train转换为一个PyTorch张…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
HTTPS证书一年多少钱?
HTTPS证书作为保障网站数据传输安全的重要工具,成为众多网站运营者的必备选择。然而,面对市场上种类繁多的HTTPS证书,其一年费用究竟是多少,又受哪些因素影响呢? 首先,HTTPS证书通常在PinTrust这样的专业平…...
在Spring Boot中集成RabbitMQ的完整指南
前言 在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...
