单例模式
概述:顾名思义就是只有一个实例,并且她只负责创建自己的对象,这个类提供了访问其唯一的对象的方式,可以直接访问,不需要实例化该列的对象。
核心代码:构造方法私有化,private
使用场景:只有行为动作,没有成员变量的时候可以使用单例模式,保证内存中只存在一个实例
实现单例模式的几种方式
①懒汉式:实例需要用到的时候才会去创建,用的时候才会去检查有没有实例,如果有就返回,没有就新建一个实例。使用synchronized关键字来保证线程安全
//懒汉式 public class LanHan{ private static LanHan instance; //私有的构造方法 private LanHan(){} public static LanHan getInstance(){ if(instance == null){ instance=new LanHan(); } return instance; } }
②饿汉式:在初始化的时候就把实例新建好了,不管有没有使用到,都会先把实例创建完。
优点:没有线程安全问题
缺点:浪费内存空间
//饿汉式 public class EHan { private static EHan instance = new EHan(); private EHan(){} public static DoubleCheck(){ return instance; } }
③双检锁:双重校验所,综合了懒汉式和饿汉式两者的优缺点整合而成的。看上面的代码实现中,特点是在synchronized关键字内外增加了一层if条件判断,这样既保证了线程安全,又比直接上锁提高了执行效率,还节省了内存空间。
public class DoubleCheck { private static DoubleCheck instance; private DoubleCheck(){} public static DoubleCheck(){ if(instance == null){ synchronized (DoubleCheck.class){ if(instance == null){ instance = new Double(); } } } } }
④静态内部类:效果类似双检锁,但是实现方法更简单,但这种方式只适合静态域的情况,双检锁方式可在实例域需要延迟初始化使用。
public class Singleton{ private static class SingletonHolder{ prvate static final Singleton INSTANCE = new Singleton(); } private Singleton(){} public static final Singleton getInstance(){ return SingletonHolder.INSTANCE; } }
⑤枚举:自动支持序列化机制,绝对防止多次实例化
public enum Singleton{ INSTANCE; public void anyMethod(){} }