当前位置: 首页 > news >正文

设计模式-单例模式(懒汉式)

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 优缺点(方式一)

  1. 起到了Lazy Loading的效果,但是只能在单线程下使用。
  2. 如果在多线程下,一个线程进入了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 优缺点(方式二)

  1. 解决了线程不安全问题。
  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 优缺点(方式三)

  1. 这种方式,本意是想对第四种实现方式的改进,因为前面同步方法效率太低,改为同步产生实例化的的代码块。
  2. 但是这种同步并不能起到线程同步的作用。跟方式一实现方式遇到的情形一致,假如一个线程进入了if(singleton==null)判断语句块,还未来来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。

4.3 结论(方式三)

  • 线程不安全,在实际开发中,不要使用这种方式

http://www.lryc.cn/news/332358.html

相关文章:

  • 算法| ss 回溯
  • 基于R语言绘制-散点小提琴图
  • Arduino开发 esp32cam+opencv人脸识别距离+语音提醒
  • LeNet卷积神经网络
  • Python常用算法思想--回溯算法思想详解【附源码】
  • Day5-Hive的结构和优化、数据文件存储格式
  • 01 计算机网络发展与分类
  • ubuntu安装sublime3并设置中文
  • python调用阿里云短信配置
  • MySQL 8.0.13安装配置教程
  • 【idea快捷键】idea开发java过程中常用的快捷键
  • 2024年腾讯云GPU云服务器配置价格表(内存/系统盘/地域)
  • 重构数据访问层-优化数据访问的开发
  • 云计算概述报告
  • C++:线程库的使用
  • 机器学习模型:决策树笔记
  • 20.2k stars项目搭建私人网盘界面美功能全
  • 卷积篇 | YOLOv8改进之引入全维度动态卷积ODConv | 即插即用
  • Pytorch实用教程:torch.from_numpy(X_train)和torch.from_numpy(X_train).float()的区别
  • 深度学习pytorch好用网站分享
  • C语言 | Leetcode C语言题解之第2题两数相加
  • Oracle基础
  • 从0到1实现RPC | 04 负载均衡和静态注册中心
  • 卷积神经网络-池化层
  • 【干货集】C# XmlHelper帮助类操作Xml文档的通用方法汇总
  • Coursera自然语言处理专项课程04:Natural Language Processing with Attention Models笔记 Week01
  • mysql MHA高可用
  • android 扫描二维码
  • [flink 实时流基础] 输出算子(Sink)
  • case语句