Java乐观锁与悲观锁-程序员宅基地

技术标签: 职场总结  java  数据库  

乐观锁与悲观锁是并发控制中两种截然不同的策略,主要用于解决多线程或多进程环境下对于共享资源的访问冲突问题,以保持数据一致性。以下是两者的详细解释:

悲观锁(Pessimistic Locking)

概念:
悲观锁基于保守的假设,认为在并发环境中,每次对共享资源的访问都极有可能发生冲突。为了确保数据的一致性,悲观锁在读取数据时就立即获取并锁定资源,使得其他线程必须等待该锁释放后才能访问同一资源。这种做法可以有效避免并发下的数据冲突,但可能造成大量的线程阻塞和上下文切换。

特点与实现:

  • 在数据库中,悲观锁通常通过显式锁定语句实现,例如SQL中的SELECT ... FOR UPDATE,它会锁定查询到的数据行,直到事务结束。
  • 在编程语言层面,Java中的synchronized关键字、ReentrantLock等提供了独占锁的功能,也属于悲观锁的范畴。

适用场景:

  • 当并发写入操作频繁或者预期冲突率较高的情况下,悲观锁是一个合适的解决方案。
  • 对于那些一旦开始修改就需要长时间占用资源的操作,悲观锁可以确保在整个操作过程中资源不被其他线程干扰。

乐观锁(Optimistic Locking)

概念:
乐观锁则是建立在较为乐观的假设之上,认为大部分情况下不会有并发冲突。它在读取数据时不进行任何锁定,而是在更新数据时检查在此期间是否有其他事务对该数据进行了修改。如果数据未被更改,则执行更新操作;反之,则采取回滚或其他补偿措施。

实现方式:

  • 常见的乐观锁实现方法包括:
    • 版本号机制:每个数据项都有一个版本号字段,每次更新时版本号递增,当试图更新时会检查版本号是否与读取时一致。
    • CAS(Compare-and-Swap/Compare-and-Set):原子指令,用于在硬件或软件级别实现无锁算法,它会尝试比较内存位置的原始值与给定预期值,如果一致则替换为新值,否则不执行任何操作。

特点与适用场景:

  • 乐观锁在并发读取多于写入,且冲突几率较小的场景下效率较高,因为减少了锁的获取和释放带来的开销,从而提高了系统的并发性和整体吞吐量。
  • 高并发环境且大多数事务仅读取而不修改数据时,乐观锁的优势尤为明显。

总结来说,悲观锁和乐观锁的选择取决于具体的业务场景和对并发控制的需求。悲观锁在处理高冲突场景时能够提供更为简单直接的保护机制,而乐观锁在低冲突场景中则可以带来更好的并发性能。设计时应综合考虑系统的并发程度、冲突可能性、性能需求等因素来决定使用哪种锁策略。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45734473/article/details/137343124

智能推荐

【动态规划 & 树形DP】树的换根DP(换根DP模板)_树形dp,换根-程序员宅基地

文章浏览阅读834次,点赞2次,收藏4次。树形 DP 中的换根 DP 问题又被称为二次扫描,通常不会指定根结点,并且根结点的变化会对一些值,例如子结点深度和、点权和等产生影响。所谓换根DP,就是基于原有的状态,通过相邻节点进行转换后,现有的状态仅仅只需要进行微小的变动即可达到完美相邻状态间的切换。通常需要两次 DFS,第一次 DFS 预处理诸如深度,点权和之类的信息,在第二次 DFS 开始运行换根动态规划。那么考虑完了两个根节点之间状态的转变,根相邻节点的状态应该如何变化?的相邻节点,这些点的树高状态并不会改变,读者可以自己思考。_树形dp,换根

启动报错org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean xxx-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏4次。今天写代码,一顿操作,封装等待。启动发现报错了,翻车现场。。。我的项目中代码@Componentpublic class A { @Autowired private B b;}@Componentpublic class B { @Autowired private A a;}显然,出现了循环依赖。解决方案1. 设计层面解决各业务层面的类做好分层,只有一个方向依赖关系,从根本上消灭循环依赖。比如 Controller -> Service -> _org.springframework.beans.factory.beancurrentlyincreationexception: error cr

算法基础 - 数论 | 快速幂、矩阵快速幂、快速乘_csdn 快速幂 矩阵快速幂 快速乘-程序员宅基地

文章浏览阅读1.5k次,点赞13次,收藏36次。文章目录一、快速幂快速幂模版(迭代,非递归)快速幂模版(递归)AcWing 875. 快速幂LeetCode 50. Pow(x, n)(快速幂 C++)LeetCode 372. 超级次方二、矩阵快速幂矩阵快速幂模版例题:求斐波那契数列的第 1e9 项例题: S=A+A2+A3+…+AkS = A + A^2 + A^3 + … + A^kS=A+A2+A3+…+AkREFERENCES一、快速幂快速幂:快速计算某个数的幂次( ana^nan )快速幂时间复杂度为 O(logn)O(logn)O(l_csdn 快速幂 矩阵快速幂 快速乘

网络数据包分析工具:Wireshark,用于捕获和分析网络数据包,识别爬虫攻击行为。怎么使用?写一个具体 的工作流-程序员宅基地

文章浏览阅读632次,点赞12次,收藏13次。他们使用Wireshark等工具对网络流量进行实时监控和分析,以识别恶意行为和潜在的安全威胁。通过使用Wireshark等工具进行网络流量分析和攻击检测,阿里工作中的网络安全团队能够及时发现并应对各种潜在的安全威胁,保障公司的网络安全和数据安全。以上是使用Wireshark进行网络数据包分析,识别爬虫攻击行为的一个基本工作流程。在阿里工作的一个可能的应用场景是网络安全团队使用Wireshark进行网络流量分析和攻击检测。使用Wireshark进行网络数据包分析可以帮助识别网络中的各种行为,包括爬虫攻击。

CCF 分蛋糕(满分代码 + 解题思路 :模拟)201703-1_code 一人拿一块蛋糕-程序员宅基地

文章浏览阅读503次。从第一个拿蛋糕的人开始枚举,每一轮迭代表示一个人拿蛋糕的过程(不论这个人是否能拿到>=k的蛋糕,他一定会拿到蛋糕,所以能拿到蛋糕的同学数量+1)根据累计这个人拿蛋糕的分量是否>=k,决定得到的蛋糕数量。每一轮迭代开始时,i都指向下一块即将分配的蛋糕。_code 一人拿一块蛋糕

为推荐系统设计的多智能体协作框架 Multi-Agent Collaboration Framework for Recommender Systems-程序员宅基地

文章浏览阅读948次,点赞21次,收藏23次。基于LLM的智能体因其决策能力和处理复杂任务的能力而备受关注。鉴于目前在推荐系统中利用智能体协作能力的空白,我们引入了MACRec,这是一个旨在通过多智能体协作增强推荐系统的新颖框架。与现有关于使用智能体进行用户/物品模拟的工作不同,我们旨在部署多智能体直接处理推荐任务。在我们的框架中,推荐任务通过各种专业智能体的协作努力来解决,包括经理用户/物品分析员反射器搜索器和任务解释器,具有不同的工作流程。

随便推点

C语言中的数组(1)-程序员宅基地

文章浏览阅读902次,点赞29次,收藏17次。一维数组的创建和初始化,一维数组的使用,一维数组在内存中的存储,以及计算数组元素的个数的方法。

android app启动页(闪屏页)白屏快速优化方案实践_android启动页大小闪屏-程序员宅基地

文章浏览阅读770次,点赞8次,收藏8次。希望本文对你有所启发,有任何面试上的建议也欢迎留言分享给大家。好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以加一下下面的技术群。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。这里放一下资料获取方式:GitHub好了~如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。_android启动页大小闪屏

win10下安装最新版HALCON19.05_halcon19.11 x86下载-程序员宅基地

文章浏览阅读9.7k次,点赞4次,收藏24次。借鉴博客 https://www.51halcon.com/thread-387-1-1.html1.下载HALCON官网下载地址 https://www.mvtec.com/download/halcon/找了很多教程,终于成功安装好HALCON了,在这里该大家分享一下过程,亲测有效。按照上图中标记选择下载,下载过程应该是需要注册一个邮箱,注册就好。2.安装下载完就可以直接安装..._halcon19.11 x86下载

.net反编译工具ILSpy-程序员宅基地

文章浏览阅读52次。下载地址:http://www.fishlee.net/soft/ilspy_chs/转载于:https://www.cnblogs.com/dengxixi/p/9327727.html

python之json序列化与反序列化_python json序列化和反序列化-程序员宅基地

文章浏览阅读2.6k次。序列化就是将python中的字典转换为一种特殊的字符串(json)那么反序列化就是,将json字符串转换为python字典想输出真正的中文需要指定ensure_ascii=False,还可以使用排序sort_keys,缩进:indentprint(json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)}, sort_keys=True, indent=4)) jso_python json序列化和反序列化

一文理解单片机BootLoader的前世今生(万字长文,配33张高清图)-程序员宅基地

文章浏览阅读1.3k次,点赞30次,收藏24次。BootLoader(引导加载程序)是一种软件,它负责在计算机系统启动时加载操作系统或其他应用程序。BootLoader通常是存储在计算机系统的非易失性存储器中(如固态硬盘、闪存等),并在系统上电时自动执行。BootLoader通常由计算机制造商或操作系统开发商提供,但也有一些独立的BootLoader可用于多个操作系统的引导管理。_bootloader