/ ** * 由静态内部类实现的单例模式 *由zhaihuilin创建于2018/6/8 16:07。 * / public class Thread0 { private Thread0(){}; // 私有的构造方法 private static class LazyHolder { // 静态内部类 private static final Thread0 instance = new Thread0(); } public static Thread0 getInstance(){ // 静态的构造方法 返回 LazyHolder。例如 ; } / ** * 1. 从外部无法访问静态内部类LazyHolder ,只有当调用Singleton.getInstance 方法的时候,才能得到单例对象INSTANCE 。 2.INSTANCE 对象初始化的时机并不是在单例类的Singleton 被加载的时候,而是在调用getInstance 方法,使得静态内部类LazyHolder 被加载的时候。 因此这种实现方式是利用classloader 的加载机制来实现懒加载,并保证构造单例的线程安全 这样的写法虽好但是也存在着单例模式共同的问题:无法防止利用反射来重复构建对象 * / // ?如何利用反射打破单例模式的 约束公共无效 的get()抛出 NoSuchMethodException,IllegalAccessException,的InvocationTargetException,InstantiationException { // 1. 获得单例构造器 构造函数构造函数= Thread0。class .getDeclaredConstructor(); // 2. 把构造器设置为可访问 constructor.setAccessible(true); // 3. 使用newInstance()构造两个不同的对象 Thread0 thread00 =(Thread0)constructor.newInstance(); Thread0 thread01 =(Thread0)constructor.newInstance(); // 验证是否是同一个对象 系统。out .println(thread00.equals(thread01));
}
}