慕课网高并发实战(三)-单例模式

.课程网站

单例模式

        单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。

1、懒汉模式

懒汉模式

优点:单例在第一次使用时进行实例化创建。

缺点:线程不安全,可能多个线程去创建多个实例。

2、懒汉+锁模式

懒汉+锁模式

优点:单例在第一次使用时进行实例化创建。

缺点:synchronized修饰方法,只允许一个线程执行getInstance()方法,影响了性能。

3、饿汉模式

饿汉模式

优点:线程安全,类在加载时就实例化创建对象,没有资源的竞争。

缺点:

1、当构造函数的处理较多时,类加载的时候会很慢,影响性能。

2、如果这个类在后面不会被使用到,则导致资源的浪费。

4、双重同步锁模式

双重同步锁模式

优点:单例在第一次使用时进行实例化创建。

缺点:线程不安全。 线程不安全原因:指令重排序

1、memory = allocate() 分配对象的内存空间

2、ctorInstance() 初始化对象

3、instance = memory 设置instance指向刚分配的内存 

JVM和CPU优化,发生指令重排:1->3->2 

因为2和3逻辑上没有直接关系,可以发生指令重排。由于指令重排导致线程不安全的原因分析:当线程A进入同步锁,开始创建对象时,执行到3,给instance分配内存空间,此时线程B过来获取instance实例时,直接取到了这个并未初始化的实例, 导致后续使用这个未初始化的实例访问时报错。

5、双重同步锁+volatile

双重同步锁+volatile模式

优点:

1、单例在第一次使用时进行实例化创建。

2、线程安全

缺点:volatile修饰变量,实现了多线程之间的数据可见性,但是影响了性能。

6、枚举模式(推荐使用)

枚举模式

优点:

1、线程安全:类似常量,在类加载时就初始化,并且枚举的私有构造方法只会被调用一次(第一次调用),不会有资源竞争问题。

2、资源节约性:在类加载时只会初始化,不会实例化,只有在第一次调用时实例化对象,不会造成资源的浪费。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 9,787评论 4 34
  • 1.单例模式概述 (1)引言 单例模式是应用最广的模式之一,也是23种设计模式中最基本的一个。本文旨在总结通过Ja...
    曹丰斌阅读 8,064评论 6 47
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,463评论 19 139
  • 摘要:人人都会设计模式系统宗旨是以简洁明了方式让你明白设计模式,本文介绍了单例设计模式,你真的全方位了解过单例模式...
    暖夏未眠丶阅读 4,097评论 0 2
  • 如果所有的分手都是背叛,那么这个世界上谁没有背叛过别人和被别人背叛过呢? 想了很久的问...
    行走一只花阅读 1,534评论 0 1