设计模式GOF23之单例模式理解

 
设计模式:
 
      将设计者的思维融入大家的学习和工作中
 
创建者模式:
 
      单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式
 
结构型模式:
 
      适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式
 
行为模式:
 
      模板方法模式,命令模式,迭代器模式,观察者模式,中介者模式,备忘录模式,解释器模式。状态模式,策略模式,职责链模式,访问者模式。
 
 
 
单例模式:
 
      保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
 
      使用场景:Task Mangager(任务管理器)
 
           回收站
 
           数据库连接池
 
           操作系统的文件系统
 
           ApplicationServelet
 
      单例模式的优点:
 
           因为只生成一个实例,系统开销小,
 
      五种单例模式

           主要:
 
           懒汉式(线程安全,调用效率高,但是不能延时加载)
 
           饿汉式(线程安全,调用效率不高。但是,可以延时加载)
 
其他:
 
      双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)
 
      静态内部类式(线程安全,调用效率高,但是,可以延时加载)
 
      枚举单例(线程安全,调用效率高,不能延时加载)
 
饿汉式实现单例模式代码中,static变量会在类装载时初始化,此时也不会出现多个线程访问该对象的问题。虚拟机保证只会装载一次该类,肯定不会发生并发访问的问题。因此我们说饿汉式天然线程安全。
 
因为静态访问方法不需要同步,因此调用效率高。但是没有延时加载
 
懒汉式
 
     Lazy load。延迟加载,懒加载。用时加载
 
     资源利用率高了,但是每次调用getInstance都需要同步,并发效率较低。
 
双重检测锁实现
 
     这个模式将同步内容下放到if内部,提尕了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建以后就没必要了。
 
     问题:由于编译器优化原因和JVM内部模型原因,偶尔会出问题。不建议使用。
 
静态内部类实现:
 
     要点:
 
          外部类没有static属性,则不会像饿汉式那样立即加载对象
 
           只有真正调用getInstance(),才会加载静态内部类。加载类是线程安全的。instancestatic final,保证了内存中只有这样一个实例存在,而且只能被赋值依次,从而保证了线程安全性。
 
     兼备了并发高效调用和延迟加载的优势。
 
枚举实现单例模式:
 
      优点:
 
           实现简单
 
           枚举本身就是单例模式,由JVM从根本上提供保证,避免通过反射或者反序列化问题。
 
           缺点:
 
                 无延迟加载
 
单例模式问题:
 
      反射可以破解上面的单例模式(除了枚举)
 
(可以在构造方法中抛出异常控制)
 
反序列化可以破解上面集中单例模式(不包含枚举)
 
     可以通过定义readResolve()防止获得不同对象
 
     ----反序列化时,如果对象所在类定义了readResolve()(实际上是以中国回调),定义返回那个对象

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值