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

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

作者: habit_learning | 来源:发表于2018-04-08 14:05 被阅读87次

.课程网站

单例模式

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

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、资源节约性:在类加载时只会初始化,不会实例化,只有在第一次调用时实例化对象,不会造成资源的浪费。

相关文章

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

    .课程网站 单例模式 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模...

  • Java高并发 -- 并发扩展

    Java高并发 -- 并发扩展 主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的笔记 死锁 死锁是指...

  • Java高并发--AQS

    Java高并发--AQS 主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的笔记 AQS是Abstra...

  • Java高并发--CPU多级缓存与Java内存模型

    Java高并发--CPU多级缓存与Java内存模型 主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的...

  • Java高并发 -- 线程池

    Java高并发 -- 线程池 主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的笔记 在使用线程池后,...

  • Java高并发--安全发布对象

    Java高并发--安全发布对象 主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的笔记 发布对像:使一...

  • Java高并发--消息队列

    Java高并发--消息队列 主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的笔记 举个例子:在购物商...

  • Java高并发--线程安全策略

    Java高并发--线程安全策略 主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的笔记 不可变对象 发...

  • Java高并发 -- J.U.C.组件扩展

    Java高并发 -- J.U.C.组件扩展 主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的笔记 F...

  • 参考标记说明

    说明:慕课网并发与高并发课程

网友评论

      本文标题:慕课网高并发实战(三)-单例模式

      本文链接:https://www.haomeiwen.com/subject/nsiphftx.html