[多线程进阶]CAS与Synchronized基本原理


专栏简介: JavaEE从入门到进阶

题目来源: leetcode,牛客,剑指offer.

创作目标: 记录学习JavaEE学习历程

希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长.

学历代表过去,能力代表现在,学习能力代表未来! 


目录:

1.CAS

1.1 什么是CAS?

1.2 CAS伪代码

1.3 CAS 是怎么实现的

1.4 CAS 的应用场景

1) 实现原子类

2) 实现自旋锁(伪代码)

1.5 CAS 的 ABA 问题

1.6 ABA问题引发的 BUG

1.7 相关面试题

2. Synchronized 基本原理

2.1 基本特点

2.2 加锁过程

2.3 其他的优化操作


1.CAS

1.1 什么是CAS?

CAS: 全称 Compare and swap , 字面意思是"比较并交换" , 一个 CAS 涉及到以下操作:

假设内存中原数据 V , A B 分别为寄存器中 , 旧的预期值和需要修改的新值. 

  • 1. 比较 A 与 V 是否相等.(比较)
  • 2. 如果比较相等 , 将 B 写入 V. (交换)
  • 3. 返回操作是否成功.

Tips: 上述交换过程中 , 并不关心 B 变量后续的情况 , 更关心的是 V 这个变量的情况(这里的交换可以理解为赋值) , CAS 可以理解成 CPU 的一个特殊指令 , 通过这个指令就可以一定程度的处理线程安全问题.


1.2 CAS伪代码

真实的 CAS 是一个原子硬件指令完成的 , 这个伪代码只是辅助理解 CAS 的工作流程.

boolean CAS(address , expectvalue , swapvalue){
    if(&address == expectedValue){
        &address = swapValue;
        return true;
    }
    return false;
}

两种典型的不是"原子性"的代码

1.check and set (判定然后设定值)[上面的 CAS 伪代码就是这种形式]

2.read and update(i++)

当多个线程对某个资源进行 CAS 操作 , 只有一个线程操作成功 , 但是并不会阻塞其他线程 , 其实线程只会收到操作失败的信号.

CAS 可以视为是一种乐观锁(或者乐观锁是 CAS 的一种实现方式)


1.3 CAS 是怎么实现的

针对不同的操作系统 , JVM 用到了不同的 CAS 实现原理 , 简单来讲:

  • Java 的 CAS 利用的是 unsafe 这个类提
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Node_Hao

您的支持是我创作的不懈动力

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

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

打赏作者

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

抵扣说明:

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

余额充值