package singleton; /** * 双重锁 * 是否Lazy初始化:是 * 是否多线程安全:是 * 描述:在多线程下能保持高性能 * @author Tendo-pein * */ public class Singleton { private volatile static Singleton singleton; private Singleton(){} public static Singleton getSingleton(){ if (singleton==null) { synchronized(Singleton.class){ if (singleton==null) { return new Singleton(); } } } return singleton; } } package singleton; /** * 恶汉式 * 是否Lazy初始化:否 * 线程是否安全:是 * 描述:比较常用,容易产生垃圾对象 * 优点:没有加锁,执行效率会提高。 * 缺点:类加载时就初始化,浪费内存。 * 它基于 classloder 机制避免了多线程的同步问题, * 不过,instance 在类装载时就实例化, * 虽然导致类装载的原因有很多种, * 在单例模式中大多数都是调用 getInstance方法, * 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载, * 这时候初始化 instance 显然没有达到 lazy loading 的效果。 * @author Tendo-pein * */ public class Singleton1 { private static Singleton1 instance = new Singleton1(); private Singleton1(){} public static Singleton1 getSingleton1(){ return instance; } } package singleton; /** * 懒汉式 * 是否 Lazy 初始化:是 是否多线程安全:是 描述:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低, 99% 情况下不需要同步。 优点:第一次调用才初始化,避免内存浪费。 缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。 getInstance() 的性能对应用程序不是很关键(该方法使用不太频繁)。 * @author Tendo-pein * */ public class Singleton2 { private static Singleton2 instance; private Singleton2(){} public static synchronized Singleton2 getSingleton2(){ if (instance==null) { return new Singleton2(); } return instance; } }