悲观锁与乐观锁的实现(详情图解)

一、前言

  • 在了解悲观锁和乐观锁之前,我们先了解一下什么是锁,为什么要用到锁?
  • 技术来源于生活,锁不仅在程序中存在,在现实中我们也随处可见,例如我们上下班打卡的指纹锁,保险柜上的密码锁,以及我们我们登录的用户名和密码也是一种锁,生活中用到锁可以保护我们人身安全(指纹锁)、财产安全(保险柜密码锁)、信息安全(用户名密码锁),让我们更放心的去使用和生活,因为有锁,我们不用去担心个人的财产和信息泄露。
  • 而程序中的锁,则是用来保证我们数据安全的机制和手段,例如当我们有多个线程去访问修改共享变量的时候,我们可以给修改操作加锁(syncronized)。当多个用户修改表中同一数据时,我们可以给该行数据上锁(行锁)。因此,当程序中可能出现并发的情况时,我们就需要通过一定的手段来保证在并发情况下数据的准确性,通过这种手段保证了当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的
  • 没有做好并发控制,就可能导致脏读、幻读和不可重复读等问题,如下图所示:
    在这里插入图片描述
    由于并发操作,如果没有加锁进行并发控制,数据库的最终的一条数据可能为3也有可能为5,导致数值不准确

二、悲观锁和乐观锁

首先我们需要清楚的一点就是无论是悲观锁还是乐观锁,都是人们定义出来的概念,可以认为是一种思想。

2.1、悲观锁

悲观锁(Pessimistic Lock): 就是很悲观,每次去拿数据的时候都认为别人会修改。所以每次在拿数据的时候都会上锁。这样别人想拿数据就被挡住,直到悲观锁被释放,悲观锁中的共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程

但是在效率方面,处理加锁的机制会产生额外的开销,还有增加产生死锁的机会。另外还会降低并行性,如果已经锁定了一个线程A,其他线程就必须等待该线程A处理完才可以处理

数据库中的行锁,表锁,读锁(共享锁),写锁(排他锁),以及syncronized实现的锁均为悲观锁

在这里插入图片描述
悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证,
在这里插入图片描述<

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
悲观锁乐观锁是在并发控制中使用的两种不同的策略。 悲观锁是指在操作数据时,先假设会发生并发冲突,因此在整个操作过程中会将数据锁定,阻塞其他操作对该数据的访问,直到当前操作完成。实现悲观锁方式有多种,比如使用数据库中的锁机制或者使用Java中的synchronized关键字来实现悲观锁适用于并发冲突较多的情况,因为它可以保证数据的一致性,但是会带来较大的性能开销。 乐观锁则是在操作数据时,先假设不会发生并发冲突,因此在操作过程中并不会对数据进行锁定。相反,它会在操作完成时检查是否发生了冲突。如果发现冲突,乐观锁会回滚当前操作并重试,直到操作成功。实现乐观锁通常使用版本号或时间戳等机制来判断是否发生了冲突。乐观锁适用于并发冲突较少的情况,因为它可以减少锁的开销,提高系统的吞吐量。 使用悲观锁时,可以通过在代码中使用synchronized关键字或者使用数据库中的锁定机制来实现锁定数据的操作。这样可以保证在操作过程中其他线程无法对被锁定的数据进行访问。而使用乐观锁时,可以通过在数据表中添加版本号字段或者时间戳字段来实现。在 #### 引用[.reference_title] - *1* *2* *3* [悲观锁乐观锁实现(详情图解)](https://blog.csdn.net/qq_14996421/article/details/106351873)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值