(面试常问)4种单例设计模式的总结(内含代码以及分析)
单例设计模式:
单例模式,是一种常见的软件设计模式.在它的核心结构中只包含了一个被称为单例的特殊类.通过单例模式可以保证系统中只有该类的一个实例对象.
优点 :
实例控制:单例模式会阻止其它对象实例化其自己的单例对象的副本,从而确保所有对象都访问的是唯一的实例
灵活性:因为类控制了实例化过程,所以类可以很灵活的更改实例化的过程
实现单例需要如下几步(基础):
1私有化构造函数
2创建一个本类对象
3 向外提供一个方法,返回这个本类对象
1饿汉式
优点:线程安全,允许多个线程同时访问
缺点:会提前初始化单例对象(在类加载的时候)
1 /** 2 * @Author : zhuhuicong 3 * 2018/11/27 21:08 4 * @Version 1.0 5 * 懒汉式 6 */ 7 public class SingalDemo01 { 8 private static SingalDemo01 singalDemo01 = new SingalDemo01(); 9 private SingalDemo01() { 10 } 11 12 public static SingalDemo01 getInstance(){ 13 return singalDemo01; 14 } 15 }
2懒汉式:
优点:不会提前初始化单例对象
缺点:线程不安全
解决方案可以通过加锁进行解决,但是加锁之后,效率低
1 /** 2 * @Author : zhuhuicong 3 * 2018/11/27 21:12 4 * @Version 1.0 5 */ 6 public class SingalDemo02 { 7 private static SingalDemo02 singalDemo02 = null; 8 private SingalDemo02() { 9 } 10 public static synchronized SingalDemo02 getInstance(){ 11 if(singalDemo02==null){ 12 singalDemo02 = new SingalDemo02(); 13 } 14 return singalDemo02; 15 } 16 }
3 双重检测锁机制:
线程安全并且不会提前初始化实例对象(注意两次判断检测的作用)
1 /** 2 * @Author : zhuhuicong 3 * 2018/11/27 21:17 4 * @Version 1.0 5 */ 6 public class SingalDemo03 { 7 private static SingalDemo03 singalDemo03 = null; 8 private SingalDemo03() { 9 } 10 11 public static SingalDemo03 getInstance(){ 12 if(singalDemo03==null){ //第一个if是为了避免每次进来都加锁,提高效率 13 synchronized (SingalDemo03.class){ 14 if(singalDemo03==null){ //第二个if是为了避免生成多个实例对象 15 singalDemo03 = new SingalDemo03(); 16 } 17 } 18 } 19 return singalDemo03; 20 } 21 }
4静态内部类的方式:
线程安全,并且不会提前初始化(对象只会在内部类加载的时候初始化,内部类只会在调用getInstance()方法的时候加载)
1 /** 2 * @Author : zhuhuicong 3 * 2018/11/27 21:24 4 * @Version 1.0 5 */ 6 public class SingalDemo04 { 7 private SingalDemo04() { 8 } 9 10 public static class Inner{ 11 public static SingalDemo04 Instance; 12 } 13 14 public static SingalDemo04 getInstance(){ 15 return Inner.Instance; 16 } 17 }