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();
}
}
