咕泡-单例 singleton设计模式笔记

##查看代码:https://gitee.com/jly521/singleton.gitgit

单例模式(Singleton)安全

  • 应用场景:保证一个类仅有一个实例,并提供一个访问它的全局访问点
  • Spring 中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory
  • 但没有从构造器级别去控制单例,这是由于Spring 管理的是是任意的Java 对象
  • Spring 下默认的Bean 均为单例

  • 经常使用单例模式写法:饿汉式、懒汉式、注册式、序列化

饿汉模式网络

  • 在类加载的时候就当即初始化,而且建立单例对象
  • 优势:没有加任何的锁、执行效率比较高, //在用户体验上来讲,比懒汉式更好
  • 缺点:类加载的时候就初始化,无论你用仍是不用,我都占着空间 //浪费了内存,有可能占着茅坑不拉屎
  • 绝对线程安全,在线程还没出现之前就是实例化了,不可能存在访问安全问题

懒汉模式性能

  • 在外部须要使用的时候才进行实例化

lazy1:线程

lazy2:3d

lazy3:对象

  • 特色:在外部类被调用的时候内部类才会被加载
  • 内部类必定是要在方法调用以前初始化
  • 巧妙地避免了线程安全问题
  • 这种形式兼顾饿汉式的内存浪费,也兼顾synchronized性能问题
  • 完美地屏蔽了这两个缺点
  • 史上最牛B的单例模式的实现方式

  • lazy3 在反射初始化时,不是线程安全的

序列化::blog

  • 反序列化时致使单例破坏

序列化内存

  • 就是说把内存中的状态经过转换成字节码的形式
  • //从而转换一个IO流,写入到其余地方(能够是磁盘、网络IO)
  • //内存中状态给永久保存下来了

反序列化get

  • //讲已经持久化的字节码内容,转换为IO流
  • //经过IO流的读取,进而将读取的内容转换为Java对象
  • //在转换过程当中会从新建立对象new

  • 实现 readResolve 方法能保证单例

注册模式::

  • Spring中的作法,就是用这种注册式单例

相关文章
相关标签/搜索