设计模式
2020-06-30 18:10:07 0 举报
AI智能生成
单例模式的几种形式
作者其他创作
大纲/内容
单例模式
由来:多个线程操作同一对象,要保证对象的唯一性(实例化过程只实例化一次)<br>解决思路:<b>有且只有一个实例化的过程产生实例化对象,提供返回对象的方法</b>
<font color="#f15a23">饿汉式</font>:加载的时候就产生实例化对象
<ul><li>线程安全:<font color="#0076b3">安全</font></li></ul>
<ul><li>懒加载:<font color="#0076b3">没有延迟</font></li></ul>
<ul><li>性能:<font color="#0076b3">会一直在内存中,影响性能</font></li></ul>
<font color="#f15a23">懒汉式:</font><font color="#5c5c5c">开始加载时候为null,等需要的时候再实例化</font>
<ul><li>线程安全:<font color="#0076b3">不安全,不能保证实例对象的唯一性</font></li></ul>
<ul><li>懒加载:<font color="#0076b3">可以延迟加载</font></li></ul>
<ul><li>性能:<font color="#0076b3">很好</font></li></ul>
<font color="#f15a23">懒汉式+同步方法:</font><font color="#5c5c5c">在返回方法中添加synchronized关键字</font>
<ul><li>线程安全:<font color="#0076b3">安全</font></li></ul>
<ul><li>懒加载:<font color="#31a8e0">可以懒加载</font></li></ul>
<ul><li>性能:<font color="#0076b3">差,synchronized会将并行会退化为串行处理</font></li></ul>
<font color="#f15a23">懒汉式+同步方法块:</font>在返回方法内部中添加synchronized块
<ul><li><font color="#5c5c5c">线程安全</font><font color="#0076b3">:不安全</font></li></ul>
<ul><li>懒加载:<font color="#0076b3">可以懒加载</font></li></ul>
性能:<font color="#0076b3">比较好</font>
<font color="#f15a23">懒汉式+同步方法块</font>:DCL(双重检查锁并发模式)
<ul><li><span style="font-size: inherit;">线程安全:</span><font color="#0076b3" style="font-size: inherit;">安全</font></li></ul>
<ul><li>懒加载:<font color="#0076b3">可以懒加载</font></li></ul>
<ul><li>性能:<font color="#0076b3">比较好</font></li></ul>
<ul><li>问题:<font color="#c41230">因为指令重排可能会引起空指针异常</font><br><font color="#0076b3">为了解决这个,所以还要在初始化时候加上volatile修饰且放在最后</font></li></ul>
<font color="#f15a23">Holder</font>:声明类的时候成员变量中不声明实例变量,<br>而是放到内部静态类中
<ul><li>线程安全:<font color="#0076b3">安全</font></li></ul>
<ul><li>懒加载:<font color="#0076b3">可以懒加载</font></li></ul>
<ul><li>性能:<font color="#0076b3">很好,这种单例目前广泛使用</font></li></ul>
<font color="#f15a23">枚举:</font>枚举相当于常量,加载的时候实例化一次
<ul><li>线程安全:<font color="#0076b3">安全</font></li></ul>
<ul><li>懒加载:<font color="#0076b3">不可以</font></li></ul>
<ul><li>性能:<font color="#0076b3">很好</font></li></ul>
<font color="#f15a23">枚举+Holder:</font><font color="#5c5c5c">使用枚举的安全+Holder的懒加载</font>
<ul><li>线程安全:<font color="#0076b3">安全</font></li></ul>
<ul><li>懒加载:<font color="#0076b3">可以</font></li></ul>
<ul><li>性能:<font color="#0076b3">很好</font></li></ul>
0 条评论
下一页