每次面试中都会遇到设计模式的问题,特别是单例模式在日常开发中的应用场景.以前就是知道有这个模式,没有深入的了解,今天正好学习了解一下.单例模式即在项目中提供唯一可访问当对象.只有一个对象被使用,实现了对象的重复使用.
1.饿汉式
/* 饿汉式 */ public class SinglePattern { private static SinglePattern singlePattern = new SinglePattern(); public static SinglePattern getInstance() { return singlePattern; } }
特点:饿汉式在类被加载的时候就已经实例化创建了对象,如果在项目中使用,只需调用该类的getInstance方法就能立刻得到该对象,速度快,如果项目中多处使用该对象,每次调用就会创建一个对象,占用的内存多,容易造成内存泄漏.
2.懒汉式
/* 懒汉式 */ public class SinglePattern { private static SinglePattern singlePattern = null; public static SinglePattern getInstance() { if (singlePattern == null) { synchronized (SinglePattern.class) { if (singlePattern == null) { singlePattern = new SinglePattern(); } } } return singlePattern; } }
特点:双重判断同步锁.这样写一开始我也觉得复杂了,为什么要加同步锁,总觉得同步锁没啥用,但是参考网上的说法,在多线程的情况下,几个线程同时访问该对象.就会出现线程抢占资源出现问题.而出现线程安全问题.加了同步锁之后,一个线程进入了,其他线程就必须等待前一个线程结束才能使用该对象资源.进入同步锁之后还要判断一次对象是否为空,这样可以避免重复创建对象,浪费内存空间.
3.静态内部类实现单例模式
/* 静态内部类实现单例模式 */ public class SinglePattern { public static SinglePattern getInstance() { return Singleholder.singlePattern; } private static class Singleholder{ private static SinglePattern singlePattern = new SinglePattern(); } }
特点:静态内部类实现的好处是,当加载外面类的时候,内部类没有被调用.只有当调用类getInstance 方法才会实例化对象.而且只是当第一次调用时候才会实例化一次,保证了对象当唯一性.