美文网首页
单例系列(1)--饿汉式单例

单例系列(1)--饿汉式单例

作者: 爱折腾的程序猿 | 来源:发表于2020-02-19 13:29 被阅读0次

什么是单例?

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例介绍:

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

主要解决:一个全局使用的类频繁地创建与销毁。

何时使用:当您想控制实例数目,节省系统资源的时候。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码:构造函数是私有的。

优点:

1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。

2、避免对资源的多重占用(比如写文件操作)。

缺点:

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

代码实现(传统实现):

/**
 * 单例一:饿汉式
 * @author 爱折腾的程序猿
 * @version 1.0
 * @date 2019/12/27 16:57
 */
public class Singleton_01  {

    private static Singleton_01 instance = new Singleton_01();

    private Singleton_01() {

    }

    public static Singleton_01 getInstance() {
        return instance;
    }

}

什么是序列化?

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

什么是序列化不安全?

序列化不安全指的是,同一个序列化对象,反序列化生成的对象不一致,这样单例就失去了意义,同时也成为了序列化攻击的漏洞。

如何解决饿汉式单例序列化不安全?

 //解决序列化不安全
    private Object readResolve(){
        return instance;
    }

解决序列化不安全(饿汉式升级版)

 import java.io.Serializable;
/**
 * 单例一:饿汉式
 * @author 爱折腾的程序猿
 * @version 1.0
 * @date 2019/12/27 16:57
 */
public class Singleton_01 implements Serializable {

    private static Singleton_01 instance = new Singleton_01();

    private Singleton_01() {

    }

    public static Singleton_01 getInstance() {
        return instance;
    }

    //解决序列化不安全
    private Object readResolve(){
        return instance;
    }

}

饿汉式单例总结

一句话总结单例:

单例类在整个程序中只有一个实例,这个类负责创建自己的对象,并确保只有一个对象被创建

代码实现三个要点:

a) 私有构造器
b) 持有该类的属性
c) 对外提供获取实例的静态方法

传统饿汉式:

线程安全、反射不安全、反序列化不安全

升级后的饿汉式:

线程安全、反射不安全、反序列化安全

如何判断反射是否安全

反射安全:通过反射创建的对象是同一个对象
反射不安全:通过反射创建的对象是不同对象

如何判断反序列化是否安全

反序列化安全:通过反序列化创建的对象是同一个对象
反序列化不安全:通过反序列化创建的对象是不同对象

下节预告:下节讲述登记式单例的具体实现

相关文章

  • 单例(Singleton)

    单例设计模式 单例模式的创建 饿汉式1 饿汉式2 懒汉式 优化后的懒汉式(线程安全): 饿汉式与懒汉式区别 单例模...

  • 单例模式

    饿汉式单例 懒汉式单例

  • 第3章 创建型模式-单例模式

    ■ 饿汉式单例类 ■ 懒汉式单例类 ■ 单例模式的实例

  • 单例模式

    单例模式(Singleton Pattern) 1.饿汉式单例 2.懒汉式单例 3.注册式单例 3.1枚举式(注册...

  • 单例系列(1)--饿汉式单例

    什么是单例? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模...

  • Singleton 单例模式

    饿汉式单例模式 饿汉式单例模式 通过静态代码块增加异常处理 懒汉式单例模式 存在线程安全问题 懒汉式单例模式 解决...

  • 单例模式

    单例模式--概念 单例模式常见的写法有:懒汉式,饿汉式,登记式。单例模式的特点有:1.单例类只能有1个实例2.单例...

  • 单例模式

    单例,全局只有一个实例 单例模式可以分为懒汉式和饿汉式: 懒汉式单例模式:在类加载时不初始化。 饿汉式单例模式:在...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • 单例模式Kotlin篇

    单例模式Java篇 单例模式 - 饿汉式/** * * @Description 饿汉式-定义一个object对象...

网友评论

      本文标题:单例系列(1)--饿汉式单例

      本文链接:https://www.haomeiwen.com/subject/xncafhtx.html