设计模式(1)单例模式——创建、破坏和防御?单例设计模式的好处

设计模式(1)单例模式——创建、破坏和防御1. 单例模式介绍java笔试题:实现单例模式_java基础笔试编程题创建一个单例模式-CSDN博客
饿汉模式(线程安全,序列化不安全) 由

一、单例模式概述Java笔试题:实现单例模式_Java基础笔试编程题创建单例模式- CSDN博客

饥饿模式(线程安全,序列化不安全)

实例初始化是在类加载时完成的,这也避免了线程同步问题(虽然线程不安全,但改变是可以的,但不建议延迟加载)。

要同步getInstance 方法,请使用synchronized 关键字。但是这两种修改方式使得代码效率非常低(每次调用getInstance()都会进行线程同步,会出现问题)。不建议使用它,因为它会导致严重的性能问题。

DCL(Double-Check-Locking)双重检查锁定机制(线程安全、延迟加载)

基于延迟模式添加对volatile 关键字的双重检查。所有线程都可以看到共享内存的最新状态,并且禁止指令对静态内部类实现进行重新排序(线程安全,但会发生多个实例)。如果序列化对象是延迟加载的)。

利用类加载机制保证实例初始化时的线程安全(静态属性是静态修改的,因此保证只实例化一次,严格保证实例化的顺序)。 枚举(线程安全、序列化安全)

线程安全:JVM 保证枚举实例的创建在任何线程访问INSTANCE 静态属性之前完成,并且由于内置的线程安全性,它在类的静态初始化阶段完成。防止反射攻击:枚举类没有可访问的构造函数,因此无法使用反射机制实例化枚举类的对象。自动支持序列化机制:Enum 序列化由JVM 控制,并防止序列化创建新的对象实例。

2、序列化和反序列化方法打破设计模式中的单例模式和单例模式解决方案(7种方法讲解得很详细) – CSDN博客

当谈到破坏单例模式的序列化和反序列化问题时,主要是readObject() 方法破坏了单例模式。这主要是因为该方法最终通过反射调用无参构造函数来创建新的对象。每次返回的对象不一致。

为了避免破坏单例,请在单例上定义一个readResolve方法,并指定该方法返回的对象的创建策略。单例模式使用setAccessible(true) 来指示正在使用反射对象,取消Java 语言访问检查以允许访问私有构造函数,而反射则放弃单例模式,因为它被设计为持久化。静态函数仅用于检索一个实例。其他方法(构造函数)或字段是私有的,无法从外部访问。反射打破了这个原则,打破了私有构造函数的限制,允许你获取单例类的私有构造函数,并用它来创建多个对象。

现在我可以访问我的构造函数,我想在其中构建防御,以防止我通过构造函数创建多个实例对象。因为反射是获取对象实例的暴力方式,并且可以直接访问私有修改的构造函数,所以你只能被动防御通过反射破坏单例模式。

# 设计模式(1) 上面有关单例模式下创建、销毁和防御源网络的相关内容——仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92720.html

(0)
CSDN的头像CSDN
上一篇 2024年6月28日
下一篇 2024年6月28日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注