一.什么叫单例模式
JVM所管理的内存也就是堆中只存在某个类的唯一一个实例,通过把构造函数私有化,然供一个静态方法提供唯一实例.单例模式经常被分为饿汉单例模式以及懒汉单例模式.饿汉单例模式是在类初始化的时候创建自己的实例.懒汉模式是在需要实例的时候再创建实例.
二.单例模式优点与缺点
优点:内存中只存在一个实例所以减少了内存开销,针对一些创建和销毁对象时开销比较的情况单例模式可以减小系统性能开销.
缺点:多线程下并发问题.
三.单例模式在jvm垃圾回收的时候的处理
在网上看到有人提到了关于单例模式会不会被垃圾回收.我能证明的就是在Hotspot虚拟机中是不会被回收的.Hotspot虚拟机采用的可达性分析算法.单例类Class的referenceon永远指向之前的实例.而方法区中的Class对象不会被垃圾回收.所以单例是一直可达的,因此单例模式在Hotspot虚拟机中不会被回收.
四.单例模式的代码实现
1.饿汉式单例模式:
1 /** 2 3 * @author xg.qiu 4 5 * @TODO Java23种设计模式之单例模式 6 7 * @date 2015年5月14日17:15:57 8 9 * @see JDK 1.510 11 */12 13 public class Singleton{14 15 /*16 17 * 1.私有无参构造函数18 19 */20 21 private Singleton(){}22 23 /*24 25 * 2.私有静态的本类实例常量对象26 27 */28 29 private final static Singletoninstance = new Singleton(); 30 31 /*32 33 * 3.提供一个对外开放的方法(直接返回常量对象:instance)34 35 */36 37 public static SingletongetInstance(){38 39 // 直接返回40 return instance;41 42 }43 44 }
2.懒汉式单例模式(多线程下不安全):
1 /** 2 3 * @author xg.qiu 4 5 * @TODO Java23种设计模式之单例模式:懒汉式 6 7 * @date 2015年5月14日17:15:57 8 9 * @see JDK 1.510 11 */12 13 public class Singleton {14 15 /*16 17 * 1.私有无参构造函数18 19 */20 21 private Singleton(){}22 23 /*24 25 * 2.私有静态的本类对象 不需要初始化26 27 */28 29 private static Singleton instance = null; 30 31 /*32 33 * 3.提供一个对外开放的方法(直接返回常量对象:instance)34 35 */36 37 public static Singleton getInstance(){38 39 if(null == instance){40 41 // 加上线程锁42 43 synchronized (Singleton.class){44 45 if(null == instance) instance = new Singleton();46 47 }48 49 }50 51 return instance;52 53 }54 55 }