CAS的理解——Java全栈知识(42)

1、JMM(Java 内存模型)

JMM(Java Memory Model) Java 内存模型,是 java 虚拟机规范中所定义的一种内存模型。
Java内存模型(Java Memory Model)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这样的底层细节。

image-20230504181638237

特点:

  1. 所有的共享变量都存储于主内存(计算机的RAM)这里所说的变量指的是实例变量和类变量。不包含局部变量,因为局部变量是线程私有的,因此不存在竞争问题。
  2. 每一个线程还存在自己的工作内存,线程的工作内存,保留了被线程使用的变量的工作副本。
  3. 线程对变量的所有的操作 (读,写)都必须在工作内存中完成,而不能直接读写主内存中的变量,不同线程之间也不能直接访问对方工作内存中的变量,线程间变量的值的传递需要通过主内存完成。

2、CAS 功能

CAS的全称是: Compare And Swap(比较再交换),它体现的一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性。
在 JUC( java.util.concurrent )包下实现的很多类都用到了 CAS 操作

  • AbstractQueuedSynchronizer(AQS框架)
  • AtomicXXX类

例子:
我们还是基于刚才学习过的 JMM 内存模型进行说明

  • 线程1与线程2都从主内存中获取变量int a = 100,同时放到各个线程的工作内存中

image-20230504181947319

一个当前内存值V、旧的预期值A、即将更新的值B,当且仅当旧的预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false。如果CAS操作失败,通过自旋的方式等待并再次尝试,直到成功

[!note]
也就是说当我们进行修改操作的时候,修改完成写入主内存的时候,只有旧值和主内存相同才进行写入,否则重新读取主内存执行修改操作。

  • 线程1操作:V:int a = 100,A:int a = 100,B:修改后的值:int a = 101 (a++)
  • 线程1拿A的值与主内存V的值进行比较,判断是否相等
  • 如果相等,则把B的值101更新到主内存中

image-20230504182129820

  • 线程2操作:V:int a = 100,A:int a = 100,B:修改后的值:int a = 99(a–)
  • 线程2拿A的值与主内存V的值进行比较,判断是否相等(目前不相等,因为线程1已更新V的值99)
  • 不相等,则线程2更新失败

image-20230504181827330

  • 自旋锁操作
  • 因为没有加锁,所以线程不会陷入阻塞,效率较高
  • 如果竞争激烈,重试频繁发生,效率会受影响

image-20230504182447552

需要不断尝试获取共享内存V中最新的值,然后再在新的值的基础上进行更新操作,如果失败就继续尝试获取新的值,直到更新成功

3、CAS 原理

CAS 底层依赖于一个 Unsafe 类来直接调用操作系统底层的 CAS 指令
image-20230504182737931
都是native修饰的方法,由系统提供的接口执行,并非java代码实现,一般的思路也都是自旋锁实现
image-20230504182838426
在java中比较常见使用有很多,比如ReentrantLock和Atomic开头的线程安全类,都调用了Unsafe中的方法

  • ReentrantLock 中的一段 CAS 代码

image-20230504182958703

4、乐观锁和悲观锁

乐观锁: (程序员写代码的时候) 乐观的认为代码一般情况没有并发, 先处理业务校验, 最后更新时才加锁(加条件)
悲观锁: (程序员写代码的时候)悲观的认为, 一定有并发问题发生, 先加锁再进行业务逻辑处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东莞呵呵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值