IODHSingleton.java package cn.lcl.pattern.singleton;/** * java中单例模式的最佳实践,既能够延迟加载,又能够保证性能。但是不适合于所有的OOP编程语言,它使用了静态内部类的方式 * 1.恶汉式 * 不
package cn.lcl.pattern.singleton; /** * java中单例模式的最佳实践,既能够延迟加载,又能够保证性能。但是不适合于所有的OOP编程语言,它使用了静态内部类的方式 * 1.恶汉式 * 不管有没有使用这个类的对象,都会将其加载进内存。浪费内存空间,特别是一般单例对象的职责都是比较重的,会耗费大量的 * 资源。 * 2.饱汉式。 * 优点是可以延迟加载,但是为了保证线程安全性。成员变量要加volatile变量,因为程序可能运行在多线程环境中,要保证 * instance字段的原子性。但是原子性字段会丢失虚拟机的部分优化。而且每次通过getInstace()方法获取单例对象的时候要做if * 判断,耗费cpu资源。所以懒汉式的缺点是性能丢失。 * 3.使用静态内部类来生成单例对象。(两者优点的结合) * Created by licho on 2017/8/15 0015. */ public class IODHSingleton { /** * 构造方法为私有 */ private IODHSingleton(){ } /** * 利用了类的加载机制。当getInstance方法不被调用时,静态内部类就不会被加载进虚拟机,也就不会为静态成员变量 * 分配空间初始化。这保证了延迟加载。 * 当外部调用了getInstance方法时。类加载器将内部类加载进虚拟机,然后初始化静态域的过程本身是线程安全的。所以 * 这里保证了性能。 * @return */ public static IODHSingleton getInstance(){ return IODHSingletonInstance.instance; } public static class IODHSingletonInstance{ public static final IODHSingleton instance=new IODHSingleton(); } }