Java设计模式~单例模式


微信公众号:程序员Hotel
专注分享程序员技术干货,包括 开发工具、Java 基础、Java 并发、Python、JVM、分布式、微服务、消息队列、Git、源码解析、数据库、设计模式、面试机经、程序人生等,助你编程之路少走弯路。
感谢您的阅读,欢迎关注



单例模式


单例(Singleton)模式的定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。


在计算机系统中,还有 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中的对话框、系统中的缓存等常常被设计成单例。


单例模式有 3 个特点:
-单例类只有一个实例对象;
-该单例对象必须由单例类自行创建;
-单例类对外提供一个访问该单例的全局访问点;


1、饥饿式单例


该模式的特点: 类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了。


是否 Lazy 初始化:否
是否多线程安全:是
实现难度:简单
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。


代码如下:


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

2、懒汉式单例


该模式的特点:类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例。


是否 Lazy 初始化:是
是否多线程安全:是
实现难度:复杂
描述:这种方式采用双重加锁机制,安全且在多线程情况下能保持高性能。
getInstance() 的性能对应用程序很关键。


代码如下:


public class Singleton {
    private volatile static Singleton instance = null;////保证 instance 在所有线程中同步

    private Singleton() {//private 避免类在外部被实例化
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {//使用synchronized关键字来同步获取实例,保证单例的唯一性
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

从上述代码可以看到,双重加锁中有两次判断。第一次检查是避免不必要的上锁。相对加锁的懒汉模式而言,第二次检查是,在给当前线程加锁后,例行检查更加安全。


3、枚举


默认枚举实例的创建是线程安全的,并且在任何情况下都是单例。实际上
枚举类隐藏了私有的构造器。
枚举类的域 是相应类型的一个实例对象
是否 Lazy 初始化:否
是否多线程安全:是
实现难度:简单


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


代码如下:


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

图片显示


下面的是我的公众号二维码图片,欢迎关注。

图注:程序员Hotel
图注:程序员Hotel

你可能感兴趣的:(Java设计模式~单例模式)