美文网首页
单例系列(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) 对外提供获取实例的静态方法
    

    传统饿汉式:

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

    升级后的饿汉式:

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

    如何判断反射是否安全

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

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

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

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

    相关文章

      网友评论

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

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