Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

饿汉式

饿汉式:类加载就会导致该单实例对象被创建

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

java`// 问题1:为什么加 final
// 问题2:如果实现了序列化接口, 还要做什么来防止反序列化破坏单例
public final class Singleton_hungry implements Serializable {

// 问题3:为什么设置为私有? 是否能防止反射创建新的实例?
private Singleton_hungry(){}

// 问题4:这样初始化是否能保证单例对象创建时的线程安全?
private static Singleton_hungry INSTANCE = new Singleton_hungry();

// 问题5:为什么提供静态方法而不是直接将 INSTANCE 设置为 public, 说出你知道的理由
public static Singleton_hungry getInstance() {
return INSTANCE;
}
public Object readResolve(){ // 防止反射创建新的实例?
return INSTANCE;
}
}`

  • 问题1:
    避免子类覆盖父类的一些方法,导致线程不安全。
  • 问题2:
    实现 readResolve 方法。当从对象流 ObjectInputStream 中读取对象时,会检查对象的类否定义了 readResolve 方法。如果定义了,则调用它返回我们想指定的对象(这里就指定了返回单例对象)。
  • 问题3:防止通过 new 创建对象实例。不能防止反射创建新的实例。
  • 问题4:可以。静态变量初始化在类加载时进行,由 jvm 进行管理,可以保证线程安全。
  • 问题5:通过方法,可以提高拓展性,改进饿汉式转化为懒汉式、利用泛型特性、增加对单例对象的控制操作。

枚举单例

复制代码
  • 1
  • 2
  • 3

javaenum Singleton { INSTANCE; }

  • 问题1:枚举单例是如何限制实例个数的
    单例相当于枚举的静态成员变量,定义几个就有几个实例。
  • 问题2:枚举单例在创建时是否有并发问题
    单例相当于枚举的静态成员变量,类加载时初始化,由 jvm 进行管理,可以保证线程安全。
  • 问题3:枚举单例能否被反射破坏单例
    不能
  • 问题4:枚举单例能否被反序列化破坏单例
    枚举实现了 Serializable 接口,可序列化,但不会被反序列破坏单例。
  • 问题5:枚举单例属于懒汉式还是饿汉式
    饿汉式
  • 问题6:枚举单例如果希望加入一些单例创建时的初始化逻辑该如何做
    枚举允许构造方法

懒汉式

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

typescriptpublic final class Singleton\_lazy { private Singleton\_lazy(){} private static Singleton_lazy INSTANCE = null; // 缺点 public static synchronized Singleton_lazy getInstance() { if(INSTANCE != null) { return INSTANCE; } INSTANCE = new Singleton_lazy(); return INSTANCE; } }

  • synchronized 保证线程安全,但锁粒度较大,性能低。

DCL 懒汉式

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

java`public final class Singleton_DCL {

private Singleton_DCL() {}

// 问题1:解释为什么要加 volatile ?
private static volatile Singleton_DCL INSTANCE= null;

// 问题2:对比实现3, 说出这样做的意义
public static Singleton_DCL getInstance() {
if(INSTANCE != null) {
return INSTANCE;
}
synchronized (Singleton_DCL.class) {

// 问题3:为什么还要在这里加为空判断, 之前不是判断过了吗
if(INSTANCE != null) {
return INSTANCE;
}
INSTANCE = new Singleton_DCL();
return INSTANCE;
}
}
}`

  • 问题1:避免指令重排序,导致赋值语句先于构造函数执行,得到一个未初始化完毕的对象。
  • 问题2、3:Double Check Lock 机制。同步代码块外部的判断语句主要用于 INSTANCE 初始化并赋值之后,此时 INSTANCE != null,如果有多个线程尝试获取单例,可以提前返回,不用执行同步代码块。而同步代码块内部的判断主要用于第一次初始化时,INSTANCE = null,此时可以有多个线程尝试获取 INSTANCE,只能有一个线程进入同步代码块,其他线程在同步代码块外阻塞,该线程创建一个单例对象之后,唤醒其他线程,再进入同步代码块,发现 INSTANCE != null,则直接返回,不用重新创建单例对象,提高了效率。

静态内部类懒汉单例

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

java`public final class Singleton_LazyHolder {
private Singleton_LazyHolder(){}

// 问题1:属于懒汉式还是饿汉式
private static class LazyHolder{
static final Singleton_LazyHolder INSTANCE = new Singleton_LazyHolder();
}

// 问题2:在创建时是否有并发问题
public static Singleton_LazyHolder getInstance() {
return LazyHolder.INSTANCE;
}
}`

  • 问题1:懒汉式。静态内部类只有在被方法调用的时候才进行初始化,类加载。
  • 问题2:无,类加载由 jvm 进行,线程安全。

【设计模式】实现线程安全单例模式的五种方式相关推荐

  1. Java23种设计模式之单例模式的五种实现方式、反射破解单例模式、不能破解枚举单例模式详解

    源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23 ...

  2. Java 单例模式常见五种实现方式

    定义 单例模式,属于创建类型的一种常用的软件设计模式. 单例模式最初的定义出现于<设计模式>(艾迪生维斯理, 1994):"保证一个类仅有一个实例,并提供一个访问它的全局访问点. ...

  3. python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  4. android ui 最新教程,Android更新UI的五种方式,androidui五种

    Android更新UI的五种方式,androidui五种handler.post activity.runOnUiThread view.post handler+Thread AsyncTask 例 ...

  5. Github项目解析(九)--实现Activity跳转动画的五种方式

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了在Activity ...

  6. python实现单例模式的三种方式及相关知识解释

    python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...

  7. java 给对象创建实例_Java中创建(实例化)对象的五种方式

    Java中创建(实例化)对象的五种方式1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反 ...

  8. java创建对象的五种方式

    java创建对象的五种方式 一.使用new关键字 二.使用clone方法 三.使用反序列化 四.使用反射 五.使用Unsafe 一.使用new关键字 如 User user=new User(); 执 ...

  9. [Android开发]Android更新UI的五种方式

    Android更新UI的五种方式: 1.handler.post 2.activity.runOnUiThread 3.view.post 4.handler+Thread 5.AsyncTask 下 ...

  10. Android -- 基础篇 -- Activity跳转动画的五种方式(下)

    上一篇文章中我们讲解了在Activity启动过程中获取组件宽高的五种方式.在Activity的启动过程中如果我们直接在生命周期方法中通过view.getWidth()或者是view.getHeight ...

最新文章

  1. 【effective c++读书笔记】【第7章】模板和泛型编程(3)
  2. 文件读写以及数据处理
  3. java clone 深复制_Java的clone():深复制与浅复制
  4. Android 抽屉效果的导航菜单实现
  5. JS获取当前日期时间并定时刷新
  6. 为什么要做稀疏编码_为什么我每天都要编码一年,所以我也学到了什么,以及如何做。...
  7. 测试 System.SysUtils.TStringHelper
  8. jni jvm 内存泄漏_解析Java的JNI编程中的对象引用与内存泄漏问题
  9. AMD总裁兼CEO苏姿丰再添要职 已被选为公司董事长
  10. Android开发笔记(十七)GIF动画的实现GifAnimation
  11. 3d立体相册特效html网页代码_网页设计程序设计的必备知识点
  12. MFC Ribbon界面设计
  13. ROS——创建工作空间并编译示例
  14. 华为数通(一):如何使用ssh console telnet来连接设备
  15. 广播风暴和环路是什么
  16. 统计推断——假设检验——简单线性回归分析
  17. ⚡写一个有发音的背单词软件⚡——四六级必过系列
  18. php mysql多线程处理数据6_PHP WIN MYSQL Rdeis 下多进程处理产品数据测试 31 万条 6 进程...
  19. 计算机学院运动会开幕式稿,大学运动会开幕式方队解说词
  20. Android项目 生成签名证书指纹

热门文章

  1. 关于常用STM32F103芯片型号代码
  2. 5-前置处理器:Pre Processors
  3. JeeWx 微信管家平台,简称“捷微”
  4. 人事面试100问题--巧妙应答
  5. 这才是程序员该有的桌面壁纸!
  6. 量子计算机编程教程,量子信息与量子计算简明教程 PDF扫描版[12MB]
  7. 如何简单使用阿里巴巴矢量图标库!?
  8. BCD码与十进制数间转换
  9. 21天学通C语言-学习笔记(6)
  10. ajaxSubmit()上传