美文网首页
第四章 单例模式(Singleton Pattern)

第四章 单例模式(Singleton Pattern)

作者: 穹生变 | 来源:发表于2019-06-20 23:07 被阅读0次

    1.简介

    • 单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

    2.场景

    1. 一个学校有一个校长,每个学生对应的校长都是一个校长实例。
    2. 我们在开发程序的过程中,一般我们都是一个类只是创建一个对象。

    3 单例模式代码实现

    1、懒汉式:线程不安全,延迟初始化,容易实现

        public class Singleton {  
        private static Singleton instance;  
        private Singleton (){}  
        public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
        }  
    }
    

    2、懒汉式:线程安全,延迟初始化,容易实现

    public class Singleton {  
        private static Singleton instance;  
        private Singleton (){}  
        public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
        }  
    }
    

    3、饿汉式:线程安全,不延迟初始化,容易实现

    public class Singleton {  
        private static Singleton instance = new Singleton();  
        private Singleton (){}  
        public static Singleton getInstance() {  
        return instance;  
        }  
    }
    

    4、双检锁/双重校验锁(DCL,即 double-checked locking):从jdk1.5开始用,延迟初始化,线程安全,比较不容易实现

    public class Singleton {  
        private volatile static Singleton singleton;  
        private Singleton (){}  
        public static Singleton getSingleton() {  
        if (singleton == null) {  
            synchronized (Singleton.class) {  
            if (singleton == null) {  
                singleton = new Singleton();  
            }  
            }  
        }  
        return singleton;  
        }  
    }
    

    5、登记式/静态内部类:线程安全,延迟初始化,实现难度为一般
    说明:这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。

    public class Singleton {  
        private static class SingletonHolder {  
        private static final Singleton INSTANCE = new Singleton();  
        }  
        private Singleton (){}  
        public static final Singleton getInstance() {  
        return SingletonHolder.INSTANCE;  
        }  
    }
    

    6、枚举:从jdk5版本开始应用,不延迟初始化,线程安全,容易实现
    说明:这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。
    这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。不过,由于 JDK1.5 之后才加入 enum 特性,用这种方式写不免让人感觉生疏,在实际工作中,也很少用。
    不能通过 reflection attack 来调用私有构造方法。

    public enum Singleton {  
        INSTANCE;  
        public void whateverMethod() {  
        }  
    }
    

    相关文章

      网友评论

          本文标题:第四章 单例模式(Singleton Pattern)

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