设计模式(一):单例模式以及volatile在单例模式中的应用(禁止指令重排序)

饿汉式:私有化构造方法,不管需不需要用到Mgr01实例,先创建一个实例,仅提供一个共有的获取实例的方法(线程安全)
在这里插入图片描述
懒汉式:私有化构造方法,提供一个静态获取Mgr03实例的方法(首先判断实例是否已经创建,没有创建才会开始创建实例)(线程不安全)
在这里插入图片描述
私有化构造方法,将获取实例的方法用synchronize修饰同步方法,效率不高原因:synchronize修饰方法需要注意同步代码的范围不能太大也不能太小,太大效率不高,太小线程不安全(线程安全,效率不高)
在这里插入图片描述
还是线程不安全,原因:一开始还没有创建实例,多个线程一起去判断INSTANCE发现为NULL,接下来这些线程就会轮流争抢锁去创建实例(线程不安全)
在这里插入图片描述
双重判断:私有化构造器,首先多线程一起去判断INSTANCE是否为NULL,等于NULL,一起去抢锁,
轮流抢到锁去创建对象,因为再一次
是同步在进行一次判断(线程安全、效率高)

在这里插入图片描述
以上还有一个问题:要不要加volatile?为什么要加volatile
volatile的两个作用:1、线程可见性 2、禁止指令重排序
1、线程可见性的概念(volatile)
一个线程对数据的修改会后,另一个线程需要重新去内存读取
例如:int x ,y;没有加volatile修饰,线程不安全,加了之后一个线程对数据的修改会后,另一个线程需要重新去内存读取。

2、在介绍volatile的禁止指令重排序前,先介绍一下指令重排序的例子:
出现指令重排序例子:
在这里插入图片描述
从汇编层面分析创建对象的过程
在这里插入图片描述
问题分析:(这边还有一点小问题,总感觉有点不对劲,暂时没想起来哪里不对劲)
在这里插入图片描述
接下来我们分析volatile如何解决指令重排序的
现介绍两种常用的禁止指令重排序的方法
在这里插入图片描述

在这里插入图片描述
1、java层面:用volatile修饰变量i
2、字节码层面:ACC_VOLATILE
3、JVM层面:内存屏障
在这里插入图片描述
在这里插入图片描述
4、hotspot层面:这边没有用原语的方式保证有序性,本质采用锁总线的方式
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值