确保一个类只有一个实例存在,而且自行实例化并向整个系统提供这个实例。是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这个是设计模式要求构造方法是private(构造方法不能是公开的,不能被外界进行实例化,方法只能用private修饰),因为只有一个实例,这个实例属于当前类,也就是当前类的成员变量,类变量就是静态变量用static修饰,由当前类的静态成员变量,提供一个静态方法,向外界提供当前类的实例,当前类只能在类的内部进行实例化,不能放在外面去,
常见的单例模式:序列号生成器、web计数器、电脑的回收站、创建一个对象需要消耗很多资源,如访问io,数据库资源时,我们可以使用单例模式减少资源的消耗。
单例模式的实现分为饿汉式和懒汉式
饿汉式:在类加载的时候进行实例化(new singleton),
懒汉式:在第一次使用的时候进行实例化(在调用方法时进行实例化)为了保证线程安全,在这里我们要进行同步处理,加锁,防止被多次实例化,(在方法上直接加锁 同步处理应该放在第一次初始化的时候,这样可以提高我们获取实例的返回速度,单例模式的实例是全局唯一的。 )
在以下的情况下会出现多个实例,1、在分布式系统中,有多个虚拟机,各个虚拟机都有一个实例。2、同一个java虚拟机,使用多个类加载器同时加载这个类产生多个实例)
单例模式一般以工具类的形式进行提供。
懒汉式中有一个经典的实现模式叫双重检查锁(双检锁)
在双重加锁机制中我们要考虑指令重排序问题,确保安全,进行初始化的实例需要加上volatile 确保开发时的可见性,虽然消耗了一点性能但是更加稳定