乐观锁和悲观锁

2023-11-17

在学习Java时,我们常常会听到乐观锁和悲观锁,那么什么是乐观锁,什么是悲观锁呢?
我们先来看一下如下情况:

乐观锁就是先更新再检验,而悲观锁就是先进行保护然后再修改。
为什么要保护?什么是保护?
我们设想如下情况
在这里插入图片描述

A=100
现在有两个线程T1和T2
T1要A-50
T2要A-50
T1和T2并发执行。
如果T1先取出来,在T1还没进行更改的时候T2就取了出来那么就会造成数据错误。

简单的了解了两个锁的内容,接下里我们给出详细的解释:

乐观锁和悲观锁是并发控制的两种不同策略,用于处理多个并发操作对共享资源的访问问题。

  1. 乐观锁:
    乐观锁假设多个事务或线程之间很少发生冲突,因此在读取数据时,不会立即上锁。相反,它会在事务提交时检查数据是否被其他事务修改。常见的实现方式是使用版本号或时间戳来追踪数据的变化。当一个事务要更新数据时,它首先会检查数据的版本号或时间戳是否与事务开始时相同,如果相同则更新数据并增加版本号/时间戳。如果检查失败,表示数据已被其他事务修改,那么当前事务可能需要重新尝试或执行冲突处理。

乐观锁的优点是没有显式的锁冲突,对于读多写少的场景可以提高并发性能。但是,如果冲突发生频率较高,可能需要重试或处理冲突的成本会增加。

  1. 悲观锁:
    悲观锁假设多个事务或线程之间会频繁发生冲突,因此在读取数据时就会上锁以防止其他事务修改。常见的实现方式是使用数据库的行级锁或表级锁。当一个事务要读取或修改数据时,它会先申请对应的锁,其他事务再次请求该锁时将被阻塞,直到持有锁的事务释放。

悲观锁的优点是可以确保数据的一致性,避免了数据冲突的可能性。然而,由于加锁会导致其他事务的阻塞,可能会降低并发性能。因此,悲观锁适用于写多读少的场景或对数据一致性要求较高的情况。

需要根据具体的应用场景和并发访问的特点来选择适合的锁策略。在实际应用中,有时也会将乐观锁和悲观锁结合使用,在具体操作前使用乐观锁进行快速检查,若检查失败再回退到悲观锁进行具体的处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

乐观锁和悲观锁 的相关文章

随机推荐

  • 【论文阅读-TPAMI2021】Curriculum Learning(课程学习)综述

    简介 Curriculum learning CL 课程学习 是一种模型训练策略 通过先让模型学习简单数据后再学习困难数据的方式模拟学生进行课程学习的场景 通用的课程学习框架为Difficulty Measurer 困难程度评估 Train
  • 不懂Python装饰器,你敢说会Python?

    对于Python学习者 一旦过了入门阶段 你几乎一定会用到Python的装饰器 它经常使用在很多地方 比如Web开发 日志处理 性能搜集 权限控制等 还有一个极其重要的地方 那就是面试的时候 对 装饰器是面试中最常见的问题之一 实战入门 抛
  • webpack从入门到放弃(二:基本属性)

    本节介绍webpack五大核心概念 一 entry 入口 指示 Webpack 从哪个文件开始打包 webpack是根据依赖关系进行打包 以入口文件为起点 根据依赖关系形成依赖树 在生产模式打包时 根据tree shaking未引用的文件不
  • 8259初始化命令字(ICW1-ICW4)

    8259A的中断操作功能很强 包括中断的请求 屏蔽 排队 结束 级联以及提供中断类型号和查询等操作 并且其操作的方式又有不同 它既能实现向量中断 又能进行中断查询 它可以用于16位机 也可用于8位机 因此 使用起来感到复杂且不好掌握 为此
  • idea 提交远程库冲突解决

    idea 提交远程库冲突解决 github团队协作 正常开发 管理得好的话 不会出现代码冲突问题 项目经理会划分模块 每个小组成员各自开发模块 公共的代码由专门的人负责维护 但是偶尔管理沟通问题导致出现冲突偶尔也是会出现的 冲突出现场景过程
  • Visual Studio Code中英文的切换

    我在学习 Flutter 的时候 使用过 VsCode 来开发 一般来说 安装好的 VsCode 都是英文版的 有些人可能不太习惯用英文版的 不过没有关系 我在这里提供中英文切换的方法给大家 切换为中文 1 点击 1 中的选项 在 2 中的
  • java栈溢出现象_JVM源码分析之栈溢出完全解读

    概述 之所以想写这篇文章 其实是因为最近有不少系统出现了栈溢出导致进程crash的问题 并且很隐蔽 根本原因还得借助coredump才能分析出来 于是想从JVM实现的角度来全面分析下栈溢出的这类问题 或许你碰到过如下的场景 日志里出现了St
  • python uiautomator2 init 作用

    目录 背景 具体步骤 总结 背景 在搭建Python的自动化测试环境时 执行脚本一直报错 ions GatewayError Uiautomator started failed
  • (Linux)docker容器安装Kibana--简单安装

    docker容器安装Kibana docker容器安装Kibana 启动Kibana docker容器安装Kibana 使用docker命令安装Kibana容器 sudo docker pull kibana 7 4 2 等待下载安装完成
  • matlab 2022更新

    matlab 2022b dictionary 对象 将唯一键映射到值以便快速查找 深度学习工具箱 直接导入 PyTorch 模型 将模型导出到 TensorFlow Simulink 将库浏览器停靠在模型中 MATLAB NET 引擎 A
  • Bootstrap JavaScript插件:警告信息 (alert.js)

    作者 WangMin 格言 努力做好自己喜欢的每一件事 CSDN原创文章 博客地址 WangMin 警告框插件 alert js 为警告框组件一个关闭功能 就是点击警告框的关闭按钮 可以让警告框消失 并将它从 DOM 中删除 使用方法 1
  • SpringBoot+ActiveMQ-点对点队列模式(消费端)

    ActiveMQ消息中间件的点对点模式point to point 消息队列 生产端案例 配合消费端测试 SpringBoot ActiveMQ生产端 ActiveMQ版本 apache activemq 5 16 5 SpringBoot
  • C#基础教程

    我的第一个 C 程序 Console WriteLine Hello World Console ReadKey 编写 Console Readkey 这个函数是为了在控制台窗口停留一下 直到敲击键盘为止 不然运行时 Hello World
  • 树莓派开机启动终端运行方法

    在路径 home pi config autostart 下建立一个文本文本 并以后缀名 desktop 结尾 根据是否需要显示终端 写入下面两段内容之一 显示终端启动 Desktop Entry Name testboot Icon ut
  • 基于SpringBoot的校园请假管理系统

    全网粉丝20W csdn特邀作者 博客专家 CSDN新星计划导师 java领域优质创作者 博客之星 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java技术领域和毕业项目实战 文末获取项目下载方式 一 项目背景介绍 校园请假信息管
  • ruoyi若依获取当前登录用户以及用户信息

    this store state user 登录成功 有token情况下 直接打印这个
  • matlab knn回归,(25条消息)KNN算法matlab函数 ClassificationKNN.fit

    mdl ClassificationKNN fit X Y 基于特征和分类标签返回分类模型 X 每行表示一个特征向量 每列表示特征向量中一个变量 Y 每行代表的是X中特征向量说代表的标签或种类 mdl ClassificationKNN f
  • 关于用vector管理CImage时遇到的坑

    假设有一个类A 里面有一个CImage 如果用vector储存 erase前面的元素后 后面的CImage就无法使用 会报ATLASSERT hBitmap m hBitmap 检查失败 struct A CImage img int tm
  • YoloV8改进策略:将CIoU替换成Wise-IoU,幸福涨点,值得拥有,还支持EIoU、GIoU、DIoU、SIoU无缝替换。

    文章目录 摘要 Wise IoU 论文翻译 摘要 简介 A ln norm损失 B 交集 并集 C 聚焦机制 相关工作 A BBR的损失函数 B 带FM的损失函数 方法 仿真实验 B 梯度消失问题的解决方法 C 提出的方法 实验 A 实验设
  • 乐观锁和悲观锁

    在学习Java时 我们常常会听到乐观锁和悲观锁 那么什么是乐观锁 什么是悲观锁呢 我们先来看一下如下情况 乐观锁就是先更新再检验 而悲观锁就是先进行保护然后再修改 为什么要保护 什么是保护 我们设想如下情况 A 100 现在有两个线程T1和