确保一个类只有一个实例,并且可以自行实例化并向整个系统提供这个实例
package com.wxc.singleton.singleton4; /** * 懒汉式 */ public class Singleton { private static volatile Singleton singleton = null; private Singleton() { } public static Singleton getSingleton() { if (singleton == null) { singleton = new Singleton(); } return singleton; } }
package com.wxc.singleton.singleton4; /** * 懒汉式 */ public class Singleton { private static volatile Singleton singleton = new Singleton(); private Singleton() { } public static Singleton getSingleton() { return singleton; } }
懒汉式在多线程环境下存在线程安全问题
在getSingleton方法上加上synchronized或者方法内部加上synchronized。
package com.wxc.singleton.singleton4; /** * 双重检查锁定 * * 加上volatile的原因: * 因为在 new Singleton中,其实在JVM内部并不是一个操作,而是分为三步 * * 1 .memory = allocate(); // 1:分配对象的内存空间 * 2. ctorInstance(memory); // 2:初始化对象 * 3. instance = memory; // 3:设置instance指向刚分配的内存地址 // 注意,此时对象还没有被初始化! * * 由于在JIT编译器上可能会出现重排序,导致,2和3的顺序交换,那就会出现instance指向了地址,即instance不为null, * 但是instance并没有初始化对象,导致有问题,访问对象的方法会报错 */ public class Singleton { private static volatile Singleton singleton = null; private Singleton() { } public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }