synchronized 和 CAS

本文详细探讨了Java中的synchronized特性,从偏向锁、轻量级锁到重量级锁的升级过程,以及JVM对synchronized的优化策略,如锁消除和锁粗化。此外,还介绍了CAS(Compare And Swap)机制,包括其原子性操作的特点和在实现原子类、自旋锁中的应用,并讨论了ABA问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

synchronized

synchronized 特性

  1. 开始是乐观锁,如果锁竞争激烈,就转换为悲观锁。
  2. 开始是轻量级锁,如果锁被长时间持有,就转为重量级锁。
  3. 通常,轻量级锁基于自旋锁实现,重量级锁基于挂起等待锁实现。
  4. 可重入锁
  5. 非公平锁
  6. 不是读写锁

synchronized 锁升级过程

JVM 把 synchronized 锁分为以下四种状态,会根据情况依次升级。

在这里插入图片描述

偏向锁

  • 对第一个尝试获取一把锁的线程,优先进入偏向锁状态。

  • 偏向锁不是真正的加锁,只是对锁做一个标记,记录这个锁属于哪个线程。

如果这个线程在整个代码执行过程中,没有遇到其他线程竞争这个锁,就不需要去加锁了。

但是如果有其他线程尝试竞争这个锁,那么偏向锁就会升级为轻量级锁(真正的加锁),其他线程就只能阻塞等待了。

偏向锁避免了不必要的加锁,提高了效率,也保证线程安全。

轻量级锁

  • 在有锁竞争的情况下,锁进入轻量级锁状态。

  • 轻量级锁通常基于自旋锁实现。

自旋锁会一直循环来获取锁,在锁竞争较小时,可以很快获取到锁。

如果锁竞争比较激烈,导致大部分线程长时间不能获取到锁,长时间的自旋操作,浪费 cpu 资源,那么自旋锁就会升级为重量级锁。

重量级锁

  • 如果锁竞争比较激烈,自旋操作也不能快速获取到锁,自旋锁就会升级为重量级锁。

  • 重量级锁基于挂起等待锁实现 。

如果一个线程加锁失败,这个线程就挂起等待,不占用cpu资源,等待系统唤醒。

等其他线程释放了这个锁,系统就会唤醒等待这个锁的线程,让这些线程尝试获取锁。

重量级锁涉及用户态和内核态之间的切换,速度较慢,时间不太可控。

目前主流 JVM 的实现,只有对锁升级,没有降级。


synchronized 优化操作

锁消除

加锁开销大,非必要不加锁。

编译器 与 JVM 判断锁是否可以消除,检测当前代码是否有必要加锁,如果没有必要加锁,代码中又写了加锁操作,就会在编译阶段把锁去掉。

StringBuffer 是一个线程安全类,里面的关键方法都加了 synchronized 关键字。在单线程环境下使用 StringBuffer, 不涉及线程安全问题,编译阶段会优化掉 StringBuffer 中的加锁操作。

锁粗化

一段代码中如果出现对同一个锁多次加锁解锁,编译器 与 JVM 就会进行锁粗化。

锁的粒度:指的是 synchronized 代码块中的代码,如果代码多,粒度就粗,代码少,粒度就少。

实际开发过程中,希望使用细粒度锁,希望 synchrnized 中的代码尽量少一些,占有锁的时间少一些,能让其他线程更快的获取到锁。

但是实际上可能没有其他线程来抢占这个锁,这种常见下,编译器 与 JVM 就会把这个锁优化为粗粒度锁,从而避免频繁加锁解锁的开销。


CAS

认识 CAS

CAS (compare and swap),字面意思 CAS 就执行一个 比较和交换 的操作。

假设要修改内存 M 的值,准备工作,寄存器 A 读取到 M 的值,寄存器 B 存放要修改的新值。

A 和 M 的值进行比较,如果相等,就将 B 的值写入 A(交换)。

CAS 的操作就是上述的比较和交换,这个操作是由硬件支持的 cpu 指令,是原子的

CAS 伪代码

伪代码帮助理解 CAS 操作的逻辑,CAS 操作其实只是一条 cpu 指令(原子性)。

// address 表示内存
// expectValue 寄存器A
// swapValue 寄存器B
boolean CAS(address, expectValue, swapValue) {
   
   
    // CAS 操作是原子的<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值