饿汉式、懒汉式、IoDH式
package CreationalPattern.Singleton; /** * 饿汉式单例模式 * 优点:在类加载时就已经实例化,无须考虑多线程的问题,调用速度和反应时间优于懒汉式。 * 缺点:资源利用率不及懒汉式,加载时间可能会比较长。 * * Created by Dennis on 2018/6/14. */ public class EagerSingleton { private static final EagerSingleton instance = new EagerSingleton(); private EagerSingleton(){} public static EagerSingleton getInstance(){ return instance; } public static void main(String[] args) { EagerSingleton s1 = EagerSingleton.getInstance(); EagerSingleton s2 = EagerSingleton.getInstance(); System.out.println(s1 == s2); } }
package CreationalPattern.Singleton; /** * 懒汉式单例模式(双重检查锁定机制保证线程安全问题) * 优点:实现延迟加载(需要用的时候才加载),资源利用率比饿汉式高。 * 缺点:通过双重检查锁定机制,系统性能会受到影响。 * * Created by Dennis on 2018/6/14. */ public class LazySingleton { private volatile static LazySingleton instance = null; //volatile关键字会屏蔽jvm做的一些代码优化,降低性能 private LazySingleton(){} public static LazySingleton getInstance(){ //第一重判断 if(instance == null){ //锁定代码块 synchronized (LazySingleton.class){ //第二重判断 if(instance == null){ instance = new LazySingleton(); } } } return instance; } public static void main(String[] args) { LazySingleton s1 = LazySingleton.getInstance(); LazySingleton s2 = LazySingleton.getInstance(); System.out.println(s1 == s2); } }
package CreationalPattern.Singleton; /** * 静态内部类(IoDH)单例模式(最好实现单例模式的方法) * Created by Dennis on 2018/6/14. */ public class Singleton { private Singleton(){} private static class HolderClass{ private static final Singleton instance = new Singleton(); } public static Singleton getInstance(){ return HolderClass.instance; } public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); System.out.println(s1 == s2); } }