单例模式分为饿汉式和懒汉式,单例类的特点是:确保一个类只能实现一个实例,自行实例化并向整个系统提供这一实例。
饿汉式就是当类加载的时候,已经自行实例化了,线程安全;
饿汉式的代码如下:
public class EHanSignle { //私有静态类变量 private static final EHanSignle eHanSignle = new EHanSignle(); //私有构造方法,只能在类的内部实例化 private EHanSignle() {} //公有静态方法。供类调用 public static EHanSignle getInstance() { return eHanSignle; } }
懒汉式就是第一次实例化的时候,才调用方法实例化自己
懒汉式代码(线程不安全)如下所示
public class LHanSignle { private static LHanSignle lHanSignle = null; private LHanSignle() {} public static LHanSignle getInstance() { if(lHanSignle == null) { lHanSignle = new LHanSignle(); } return lHanSignle; } }
为了实现线程安全有三种方法:
第一种就是在getInstance的方法上加同步;
public class LHanSignle { private static LHanSignle lHanSignle = null; private LHanSignle() {} public static synchronized LHanSignle getInstance() { if(lHanSignle == null) { lHanSignle = new LHanSignle(); } return lHanSignle; } }
第二种就是双重检查锁定
public class LHanSignle { private static LHanSignle lHanSignle = null; private LHanSignle() {} public static LHanSignle getInstance() { if (lHanSignle == null) { synchronized (LHanSignle.class) { if (lHanSignle == null) { lHanSignle = new LHanSignle(); } } } return lHanSignle; } }
第三种方法就是静态内部类(推荐):
public class LHanSignle { private static class loadClass{ private static final LHanSignle lHanSignal = new LHanSignle(); } private LHanSignle() {} public static LHanSignle getInstance() { return loadClass.lHanSignal; } }