笔记:JUC学习

JUC -> Java.util.current

volatile: 轻量级同步机制  

  • 保证可见性
  • 不保证原子性
  • 禁止指令重排序

JMM(JAVA Memory Model) :Java内存模型(抽象规范)

  • 可见性:当某一个线程从主内容读取变量到自己的工作内存,在本地自己的工内存修改值后刷新回主内存,其他本地内存拥有该变量的值会被强制重新从主内存读取变量值
  • 原子性:操作要么同时成功,要么同时失败

例子:i++ ,i++在指令中可大体可分为3步

  1.  获取i的值
  2.  i+1
  3. 返回i的值

在此过程中,其他线程有可能修改i的值,所以是非线程安全

解决原子性有两个方式: Synchronize 关键字

                                        使用JUC包下的AtomicIntger等带原子性的封装类

指令重排序:在单线程下指令重排序不会影响最后执行结果,而在多线程下有可能发生数据错乱。

禁止指令重排序的原理就是在增加内存屏障,内存屏障前后可以进行指令重排序

volatile的应用:

  • 单例模式

单例模式是线程不安全的

解决办法:DCL(Double Check Lock 双端捡锁机制)与Volatile

DCL(Double Check Lock 双端捡锁机制):

倘若单单使用DCL还是线程不安全,因为有可能发生指令重排序

构造一个对象可以分为3步

  1. 分配对象内存空间
  2. 初始化对象
  3. 引用变量指向内存地址

这三步可能发生指令重排序,如果3和2重排序,那么指针将指向一个地址不为空,内容却为空的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值