设计模式--单例模式
设计模式--单例模式
1.概述
1.1 定义
"Ensure a class has only one instance,and provide global point of access to it"(确保该类只有一个实例,而且想整个系统提供这个实例)
1.2 意义
由于单例模式在内存中只有一个实例对象,节约内存空间,减少了对象创建、GC时的系统消耗。
1.3 应用
单例模式(Singleston Pattern)经常能够在程序中看见,例如Spring框架中默认Bean为Singleton.
2.详解
注:以下代码都没有考虑反射强行创建对象。
单例模式的通用代码
1 public class Singleton { 2 // 静态的对象实例 3 private static Singleton instance = new Singleton(); 4 // 静态方法获得该类的实例对象 5 public static Singleton getInstance(){ 6 return instance; 7 } 8 // 私有的构造方法,避免其他类创建该类的对象。 9 private Singleton(){} 10 }
有一点小小的问题:当我们访问该类的其他静态方法、静态域会造成该类的实例化,浪费内存空间。
~~~~~~~~~~~~~~~~~~~~~我是无聊的分割线~~~~~~~~~~~~~~~~~~~~
比上面好一点的单例模式
1 public class Singleton { 2 // 私有的构造方法,避免其他类创建该类的实例对象 3 private Singleton(){} 4 // 静态方法获得该类的实例对象 5 public static Singleton getInstance(){ 6 return SingletonInstance.instance; 7 } 8 // 内部类初始化实例对象 9 private static class SingletonInstance{ 10 static Singleton instance = new Singleton(); 11 } 12 }
~~~~~~~~~~~~~~~~~~~~~我是萌萌的分割线~~~~~~~~~~~~~~~~~~~~
差的单例模式
1 public class Singleton { 2 // 静态的实例对象 3 private static Singleton instance; 4 // 静态方法获得该类的实例对象 5 public static Singleton getInstance(){ 6 if(instance == null){ 7 instance = new Singleton(); 8 } 9 return instance; 10 } 11 // 私有的构造方法,避免其他类创建该类的实例对象 12 private Singleton(){} 13 }
问题:当高并发时,系统实际上会产生多了实例对象。如线程A执行到instance = new Single(),可能还没有获得对象(对象初始化需要时间)时,而线程B执行到instance == null判断为true继续创建新的实例对象。