单例模式的5种实现
来源:互联网 发布:工商银行客户端 mac 编辑:程序博客网 时间:2024/06/05 20:32
概要:主要有以下五种,除了4和5 ,安全与否取决于是否加synchronized关键字,加了之后肯定对效率肯定有影响
- 懒汉
- 饿汉
- 二次检查
静态内部类(只加载一次)
以上四种都存在2个问题
- 会被反射的setAccessible(true)破坏单例模式;
- 反序列化时会破坏单例
解决方式如下:
单元素枚举(最优)
//懒汉 class LazySingleton{ private static LazySingleton singLeton = new LazySingleton(); private LazySingleton(){ } public synchronized LazySingleton getLazySingleton(){ if(singLeton==null){ return new LazySingleton(); } return singLeton; } } //饿汉 class HunSingleton{ //安全,但类加载时就初始化 private static HunSingleton singleton = new HunSingleton(); private HunSingleton(){} public static HunSingleton getHunSinglelton(){ return singleton; } } //双重校验 class DoubleCheckSingleton{ private static DoubleCheckSingleton singleton; private DoubleCheckSingleton(){} public static DoubleCheckSingleton getHunSinglelton(){ if(singleton==null){ synchronized(DoubleCheckSingleton.class){ //第二次判断的目的是在第一次判断的时候创建了对象 //第一次判断是为了效率 if(singleton==null){ return new DoubleCheckSingleton(); } } } return singleton; } } //静态内部类 class ClazzSingleton{ private ClazzSingleton(){}; public ClazzSingleton getSingleton(){ return InnerClazz.singleton; } static class InnerClazz{ private static ClazzSingleton singleton = new ClazzSingleton(); }//用于解决反序列化后 对象不一致的问题,直接在类里加一下方法:private Object readResolve(){ return singleton;}//解决被反射破坏单例的问题:在构造函数中增加次数验证,类似于List中的madCount private Demo() throws Exception{ if(madCount!=0){ throw new Exception("创建过对象"); } madCount++; } //单元素枚举 enum EnumSingleton{ INSTANCE; public void show(){ System.out.println("Ea"); } } //利用反射破坏单例模式 public void destroy(){ try { Constructor<Demo> coo = Demo.class.getDeclaredConstructor(); //此处设置权限 coo.setAccessible(true); Demo d = coo.newInstance(); Demo e = coo.newInstance(); System.out.println(d==e);//false } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { }}
阅读全文
0 0
- 单例模式的5种实现
- 单例模式的几种实现
- 单例模式的七种实现
- 单例模式的三种实现
- 单例模式的几种实现
- 单例模式的三种实现
- 单例模式的七种实现
- 单例模式的几种实现
- 单例模式的几种实现
- 单例模式的三种实现
- 单例模式的几种实现
- 单例模式的5种实现方式
- 单例模式的5种实现方法。
- java单例模式的5种实现
- 单例模式的5种JAVA实现
- 单例模式的5种实现方式
- 单例模式的实现
- 单例模式的实现
- Java中的基本数据类型与引用数据类型
- 面向切面的 Spring —— 如何通过切点来选择连接点?
- Linux 内存优化
- 抽象类和接口
- MeterailDesign最佳UI设计
- 单例模式的5种实现
- 依赖注入及原生模拟依赖注入的方法
- 搭载SRS服务器(二)-RTMP部署实例
- Angularjs轻松实现表格按指定列排序
- P
- 《高性能MySQL》学习笔记三
- 欢迎使用CSDN-markdown编辑器
- js创建数组的四种方法、常用方法、属性
- 浅谈MVC(jsp+servlet+JavaBean简单实例)