1、单例模式
1、实现方式
-
饿汉式
public class A { private static final A a = new A(); private A() { } public static A getInstance() { return a; } }
-
懒汉式
懒汉式优点是单例只有在使用时才初始化单例,在一定程度上节约了资源;缺点是第一次加载时需要及时进行实例化,反应稍慢,最大的问题是每次调用都进行同步,造成不必要的同步开销。这种模式一般不建议使用。public class A { private static A a; private A() { } public static synchronized A getInstance() { if (a == null){ a = new A(); } return a; } }
-
DCL单例模式
DCL方式实现单例模式的优点是既能够在需要时候才初始化单例,又能保证线程安全,且单例对象初始化后调用不进行同步锁。
缺点:在某些情况下出现失效问题,也就是双重检查锁定失效。public class Singleton { private static Singleton sInstance; private Singleton() { } public static Singleton getInstance() { if (sInstance == null){ synchronized (Singleton.class) { sInstance = new Singleton(); } } return sInstance; } }
-
静态内部类单例模式
第一次加载Singleton类时并不会初始化sInstance,只有在第一次调用Singleton.getInstance方法才会导致sInstance被初始化,因此,第一次调用getInstance会导致虚拟机加载SingletonHolder类,这种方式不仅能确保线程安全,也能够保证单例对象的唯一性,同时也延迟了单例的实例化,所以推荐使用这种模式。public class Singleton { private Singleton() { } public static Singleton getInstance() { return SingletonHolder.sInstance; } private static class SingletonHolder{ private static final Singleton sInstance = new Singleton(); } }
网友评论