当前位置: 首页 > article >正文

Java|乐观锁和悲观锁在自旋的时候分别有什么表现?

乐观锁和悲观锁是两种不同的并发控制策略,各自采用不同的机制来处理线程之间的资源竞争。

乐观锁

1. 定义

乐观锁是一种假设冲突不会发生的并发控制策略,通常不对资源进行加锁,而是在操作前不加锁,操作后再进行验证。乐观锁通常通过 CAS(Compare and Swap) 操作实现。

2. 自旋过程
  • CAS 操作: 在乐观锁中,线程在更新某个共享资源时,会使用 CAS 操作。CAS 是一种原子操作,它会检查一个变量的当前值是否等于预期值(旧值),如果相等,则将其更新为新值。
  • 不断尝试: 如果多个线程同时执行 CAS 操作,只有一个线程能够成功更新值,其他线程会失败。失败的线程可以选择:
    • 重试操作,即重新读取数据并尝试再次执行 CAS。
    • 根据具体实现,可能会进行一定的退避策略,减少冲突的可能性。
3. 总结

乐观锁的自旋主要体现在不断进行 CAS 操作,而不是简单地检查锁的状态。线程会尝试进行数据更新,直到成功为止。

悲观锁

1. 定义

悲观锁则假设冲突总是会发生,因此在访问共享资源时会主动加锁,以保护资源不被其他线程访问。

2. 自旋过程
  • 加锁操作: 在使用悲观锁时,线程在访问共享资源之前会尝试加锁。
  • 等待: 如果锁已经被其他线程持有,当前线程会被阻塞(或者在某些实现中可能会自旋等待,取决于具体的锁实现)。
  • 访问资源: 一旦成功获取到锁,线程便可以安全地访问共享资源。
  • 释放锁: 访问完成后,线程会释放锁,以便其他线程可以继续访问。
3. 总结

悲观锁的自旋(如果采用自旋锁的实现方式)主要体现在对锁的状态的检查,线程会反复尝试获取锁。如果采用传统的悲观锁,线程则会被阻塞,而不是自旋。

关键区别

  • 乐观锁:
    • 假设冲突不会发生,采用 CAS 操作进行控制。
    • 适合于读多写少的场景,能够提高并发性能。
  • 悲观锁:
    • 假设冲突会发生,采用加锁的方式进行控制。
    • 适合于写多的场景,确保数据一致性。

总结

  • 乐观锁:通过不断尝试 CAS 操作来更新共享资源,适用于并发较高的环境。
  • 悲观锁:通过加锁和阻塞等待来确保线程安全,适用于高写入冲突的场景。

http://www.kler.cn/news/363486.html

相关文章:

  • 2024年10月24日随笔
  • 探寻医疗行业人力资源管理系统优选方案
  • Scala的trait特质
  • Apache Cordova学习计划
  • 面试官:数据库 delete 表数据,磁盘空间还是被一直占用,为什么?
  • visual studio设置修改文件字符集方法
  • 论文速读:面向单阶段跨域检测的域自适应YOLO(ACML2021)
  • 基于C#开发游戏辅助工具的Windows底层相关方法详解
  • ThreadLocal源码详解
  • 前言——25机械考研复试专业面试问题汇总 机械复试超全流程攻略 机械复试看这一个专栏就够用了!机械复试调剂英语自我介绍口语专业面试常见问题总结 机械保研面试
  • 实用的 Python 小脚本
  • 无线网络的几种认证与加密方式
  • 程序员职业生涯总结之设计自己的人生算法
  • 【github小问题】——push后报错error: src refspec master does not match any
  • 数据链中常见电磁干扰matlab仿真,对比噪声调频,线性调频,噪声,扫频,灵巧五种干扰模型
  • 基于Springboot相亲网站系统的设计与实现
  • C#第三讲:面向对象、类、对象、类成员【定义】
  • React Native 持久化数据
  • 502 错误码通常出现在什么场景?
  • C/C++语言基础--C++四大类型转换讲解
  • goland/phpstrom快捷键
  • 太速科技-217-A(B)-Base Camera link 转光纤传输双向模块
  • 后端接口接受的是文件流,前端怎么把一张图片地址转换成文件流?
  • 华为ENSP基础实验
  • 【电机应用】变频器控制——变频水泵、变频空调
  • VMware Workstation Pro 16 搭建 android-x86过程问题罗列