
设计意图:使用单例模式,可以保证为一个类只生成唯一的实例对象.类图如上.单例分为如下二种:
1)饿汉式-类装载的时候就会创建类的实例
public class Singleton { private static Singleton singleton= new Singleton(); /** * 私有构造方法 */ private Singleton(){} /** * 静态的全局访问方法 */ public static Singleton getSingleton(){ return singleton; } } |
2)懒汉式-不创建实例,等到需要用到实例的时候再创建
public class Singleton { private static Singleton singleton = null; /** * 私有默认构造方法 */ private Singleton() { } /** * 静态的全局访问方法 */ public static Singleton getSingleton() { if (null == singleton) { singleton = new Singleton(); } return singleton; } } |
问题:懒汉式在并发进入null == singleton可能会创建多个对象,为了线性安全
public class Singleton { private static Singleton singleton = null; /** * 私有默认构造方法 */ private Singleton() { } /** * 静态的全局访问方法 */ public static synchronized Singleton getSingleton() { if (null == singleton) { singleton = new Singleton(); } return singleton; } } |
问题:synchronized 多个线程同时需要获取singleton实例时只能一个一个线程排队执行,降低了性能,为了提高性能进行双重检查如下
public class Singleton { private volatile static Singleton singleton = null; /** * 私有默认构造方法 */ private Singleton() { } /** * 静态的全局访问方法 */ public static Singleton getSingleton() { //先检查实例是否已创建,如果未创建才进入同步块 if (null == singleton) { synchronized (Singleton.class) { //再次检查实例是否已创建,如果真的未创建才创建实例 if (null == singleton) { singleton = new Singleton(); } } } return singleton; } } |

