Java设计模式

一、职责型模式

1.单例模式

懒汉式单例:有两个很重要的细节。

        a.两重if的双重检查:

         第一个if判断的作用:是为了提高程序的 效率,当Singleton对象被创建以后,再获取Singleton对象时就不用去验证同步代码块的锁及后面的代码,直接返回Singleton对象。

        第二个if判断的作用:是为了解决多线程下的安全性问题,也就是保证对象的唯一。

        b.使用volatile关键字来防止指令重排序。

        instance = new Singleton();这条语句不是一个原子操作,编译后会多条字节码指令:

        步骤1.为new出来的对象开辟内存空间。

        步骤2.初始化,执行构造器方法的逻辑代码片段。

        步骤3.完成instance引用的赋值操作,将其指向刚刚开辟的内存地址。

        问题场景:

        一个线程执行到instance = new Singleton();这条语句时,不是按照1,2,3来初始化一个对象,而是按照1,3,2的顺序,这样当这个线程执行完步骤3时,又有另外一个线程执行到第一层if判,它会判断instance不为空,而直接返回instance,此时instance是不一个不为null的但是没有初始化完成的对象。由于指令重排序导致第二个线程提前拿到了一个不完整的instance对象。

饿汉式单例:全局的单例实例在类装载时构建的实现方式,不存在线程安全问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、什么是设计模式(Design Patterns)? 设计模式(Design pattern)是一套被反复使用、...
    夏与清风阅读 1,787评论 0 1
  • 阅读原文 在介绍单例模式之前,我们先了解一下,什么是设计模式?设计模式(Design Pattern):是一套被反...
    gyl_coder阅读 251评论 0 3
  • 单例模式可能是后端学习者接触到的第一种设计模式,可是单例模式真的有那么简单吗?在并发模式下会出现什么样的问题?在学...
    CatalinaX阅读 457评论 0 0
  • 下夜班,回家先做饭为自己,追看自己喜欢的书,烧水,泡新进的陈皮普洱茶。 点买来好久也没用的香,用小巧玲珑的莲花座,...
    韩溪流阅读 168评论 0 0
  • 【前言】 最近,我的一个常来往的亲戚离世了。因为他生前待我们家人很好,作为一个晚辈,悲伤是必然的。 很多痛是说不出...
    青争鱼6阅读 522评论 0 0

友情链接更多精彩内容