单例设计模式:
单例模式,是一种常见的软件设计模式.在它的核心结构中只包含了一个被称为单例的特殊类.通过单例模式可以保证系统中只有该类的一个实例对象.
优点 :
实例控制:单例模式会阻止其它对象实例化其自己的单例对象的副本,从而确保所有对象都访问的是唯一的实例
灵活性:因为类控制了实例化过程,所以类可以很灵活的更改实例化的过程
实现单例需要如下几步(基础):
1私有化构造函数
2创建一个本类对象
3 向外提供一个方法,返回这个本类对象
1饿汉式
优点:线程安全,允许多个线程同时访问
缺点:会提前初始化单例对象(在类加载的时候)

1 1 /** 2 2 * @Author : zhuhuicong 3 3 * 2018/11/27 21:08 4 4 * @Version 1.0 5 5 * 懒汉式 6 6 */ 7 7 public class SingalDemo01 { 8 8 private static SingalDemo01 singalDemo01 = new SingalDemo01(); 9 9 private SingalDemo01() { 1010 } 1111 1212 public static SingalDemo01 getInstance(){ 1313 return singalDemo01; 1414 } 1515 }
View Code
2懒汉式:
优点:不会提前初始化单例对象
缺点:线程不安全
解决方案可以通过加锁进行解决,但是加锁之后,效率低

1 1 /** 2 2 * @Author : zhuhuicong 3 3 * 2018/11/27 21:12 4 4 * @Version 1.0 5 5 */ 6 6 public class SingalDemo02 { 7 7 private static SingalDemo02 singalDemo02 = null; 8 8 private SingalDemo02() { 9 9 } 1010 public static synchronized SingalDemo02 getInstance(){ 1111 if(singalDemo02==null){ 1212 singalDemo02 = new SingalDemo02(); 1313 } 1414 return singalDemo02; 1515 } 1616 }
View Code
3 双重检测锁机制:
线程安全并且不会提前初始化实例对象(注意两次判断检测的作用)

1 1 /** 2 2 * @Author : zhuhuicong 3 3 * 2018/11/27 21:17 4 4 * @Version 1.0 5 5 */ 6 6 public class SingalDemo03 { 7 7 private static SingalDemo03 singalDemo03 = null; 8 8 private SingalDemo03() { 9 9 } 1010 1111 public static SingalDemo03 getInstance(){ 1212 if(singalDemo03==null){ //第一个if是为了避免每次进来都加锁,提高效率 1313 synchronized (SingalDemo03.class){ 1414 if(singalDemo03==null){ //第二个if是为了避免生成多个实例对象 1515 singalDemo03 = new SingalDemo03(); 1616 } 1717 } 1818 } 1919 return singalDemo03; 2020 } 2121 }
View Code
4静态内部类的方式:
线程安全,并且不会提前初始化(对象只会在内部类加载的时候初始化,内部类只会在调用getInstance()方法的时候加载)

1 1 /** 2 2 * @Author : zhuhuicong 3 3 * 2018/11/27 21:24 4 4 * @Version 1.0 5 5 */ 6 6 public class SingalDemo04 { 7 7 private SingalDemo04() { 8 8 } 9 9 1010 public static class Inner{ 1111 public static SingalDemo04 Instance; 1212 } 1313 1414 public static SingalDemo04 getInstance(){ 1515 return Inner.Instance; 1616 } 1717 }
View Code