广告
返回顶部
首页 > 资讯 > 精选 >怎么理解Java悲观锁与乐观锁
  • 728
分享到

怎么理解Java悲观锁与乐观锁

2023-06-04 22:06:59 728人浏览 八月长安
摘要

本篇内容介绍了“怎么理解Java悲观锁与乐观锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1锁(Lock)在介绍悲观锁和乐观锁之前,让我们

本篇内容介绍了“怎么理解Java悲观与乐观锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1

锁(Lock)

在介绍悲观锁和乐观锁之前,让我们看一下什么是锁。

锁,在我们生活中随处可见,我们的门上有锁,我们存钱的保险柜上有锁,是用来保护我们财产安全的。

程序中也有锁,当多个线程修改共享变量时,我们可以给修改操作上锁(syncronized)。

当多个用户修改表中同一数据时,我们可以给该行数据上锁(行锁)。因此,锁其实是在并发下控制多个操作的顺序执行,以此来保证数据安全的变动。

并且,锁是一种保证数据安全的机制和手段,而并不是特定于某项技术的。悲观锁和乐观锁亦是如此。本篇介绍的悲观锁和乐观锁是基于数据库层面的。

怎么理解Java悲观锁与乐观锁

2

悲观锁

悲观锁(Pessimistic Concurrency Control),第一眼看到它,相信每个人都会想到这是一个悲观的锁。没错,它就是一个悲观的锁。

那这个悲观体现在什么地方呢?悲观是我们人类一种消极的情绪,对应到锁的悲观情绪,悲观锁认为被它保护的数据是极其不安全的,每时每刻都有可能变动,一个事务拿到悲观锁后(可以理解为一个用户),其他任何事务都不能对该数据进行修改,只能等待锁被释放才可以执行。

数据库中的行锁,表锁,读锁,写锁,以及syncronized实现的锁均为悲观锁。

怎么理解Java悲观锁与乐观锁

这里再介绍一下什么是数据库的表锁和行锁,以免有的同学对后面悲观锁的实现看不明白。

我们经常使用的数据库是mysqlMysql中最常用的引擎是Innodb,Innodb默认使用的是行锁。而行锁是基于索引的,因此要想加上行锁,在加锁时必须命中索引,否则将使用表锁。

怎么理解Java悲观锁与乐观锁

3

乐观锁

与悲观相对应,乐观是我们人类一种积极的情绪。乐观锁(Optimistic Concurrency Control)的“乐观情绪”体现在,它认为数据的变动不会太频繁。因此,它允许多个事务同时对数据进行变动。

但是,乐观不代表不负责,那么怎么去负责多个事务顺序对数据进行修改呢?

乐观锁通常是通过在表中增加一个版本(version)或时间戳(timestamp)来实现,其中,版本最为常用。

事务在从数据库中取数据时,会将该数据的版本也取出来(v1),当事务对数据变动完毕想要将其更新到表中时,会将之前取出的版本v1与数据中最新的版本v2相对比,如果v1=v2,那么说明在数据变动期间,没有其他事务对数据进行修改,此时,就允许事务对表中的数据进行修改,并且修改时version会加1,以此来表明数据已被变动。

如果,v1不等于v2,那么说明数据变动期间,数据被其他事务改动了,此时不允许数据更新到表中,一般的处理办法是通知用户让其重新操作。不同于悲观锁,乐观锁是人为控制的。

怎么理解Java悲观锁与乐观锁

4

如何实现

经过上面的学习,我们知道悲观锁和乐观锁是用来控制并发下数据的顺序变动问题的。那么我们就模拟一个需要加锁的场景,来看不加锁会出什么问题,并且怎么利用悲观锁和乐观锁去解决。

场景:A和B用户最近都想吃猪肉脯,于是他们打开了购物网站,并且找到了同一家卖猪肉脯的>店铺。下面是这个店铺的商品表Goods结构和表中的数据。

怎么理解Java悲观锁与乐观锁

从表中可以看到猪肉脯目前的数量只有1个了。在不加锁的情况下,如果A,B同时下单,就有可能导致超卖。

悲观锁解决

利用悲观锁的解决思路是,我们认为数据修改产生冲突的概率比较大,所以在更新之前,我们显示的对要修改的记录进行加锁,直到自己修改完再释放锁。加锁期间只有自己可以进行读写,其他事务只能读不能写。

A下单前先给猪肉脯这行数据(id=1)加上悲观锁(行锁)。此时这行数据只能A来操作,也就是只有A能买。B想买就必须一直等待。

当A买好后,B再想去买的时候会发现数量已经为0,那么B看到后就会放弃购买。

那么如何给猪肉脯也就是id=1这条数据加上悲观锁锁呢?我们可以通过以下语句给id=1的这行数据加上悲观锁

  select num from goods where id = 1 for update;

“怎么理解Java悲观锁与乐观锁”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么理解Java悲观锁与乐观锁

本文链接: https://www.lsjlt.com/news/240221.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么理解Java悲观锁与乐观锁
    本篇内容介绍了“怎么理解Java悲观锁与乐观锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1锁(Lock)在介绍悲观锁和乐观锁之前,让我们...
    99+
    2023-06-04
  • 详解Java中的悲观锁与乐观锁
    目录一、悲观锁二、乐观锁三、CAS四、AtomicXXX五、CAS中的ABA问题六、ABA问题解决方案七、使用CAS会引起的问题八、Synchronized锁优化九、偏向锁十、轻量级...
    99+
    2022-11-12
  • Java中的悲观锁与乐观锁怎么掌握
    要掌握Java中的悲观锁和乐观锁,可以遵循以下步骤:1. 了解悲观锁和乐观锁的概念:- 悲观锁(Pessimistic Lockin...
    99+
    2023-08-12
    Java
  • redis乐观锁与悲观锁怎么使用
    本篇内容主要讲解“redis乐观锁与悲观锁怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“redis乐观锁与悲观锁怎么使用”吧!概念Redis是一个内存中的键值存储系统,支持多种数据结构,...
    99+
    2023-07-06
  • Java多线程之悲观锁与乐观锁
    目录1. 悲观锁存在的问题2. 通过CAS实现乐观锁3. 不可重入的自旋锁4. 可重入的自旋锁总结问题: 1、乐观锁和悲观锁的理解及如何实现,有哪些实现方式? 2、什么是乐观锁和悲观...
    99+
    2022-11-13
  • java中乐观锁与悲观锁的概念
    这篇文章主要介绍“java中乐观锁与悲观锁的概念”,在日常操作中,相信很多人在java中乐观锁与悲观锁的概念问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java中乐观锁与悲观锁的概念”的疑惑有所帮助!接下来...
    99+
    2023-06-19
  • MySQL中的悲观锁与乐观锁
    在关系型数据库中,悲观锁与乐观锁是解决资源并发场景的解决方案,接下来将详细讲解🔎一下这两个并发解决方案的实际使用及优缺点。 首先定义一下数据库,做一个最简单的库存表,如下设计: CREATE TA...
    99+
    2022-05-15
    MySQL 悲观锁 MySQL 乐观锁
  • redis乐观锁与悲观锁的实战
    目录概念乐观锁悲观锁乐观锁示例悲观锁示例总结提升概念 Redis是一个内存中的键值存储系统,支持多种数据结构,如字符串、哈希、列表等。Redis提供了两种锁机制,即乐观锁和悲观锁。 乐观锁 乐观锁是一种乐观的并发控制策略...
    99+
    2023-04-13
    redis 乐观锁 悲观锁 redis 乐观锁 redis 悲观锁
  • 合理的使用MySQL乐观锁与悲观锁
    针对 MySQL的乐观锁与悲观锁的使用,基本都是按照业务场景针对性使用的。针对每个业务场景,对应的使用锁。 但是两种锁无非都是解决并发所产生的问题。下面我们来看看如何合理的使用乐观锁与悲观锁   何为悲观锁 悲观锁(Pessi...
    99+
    2015-02-12
    合理的使用MySQL乐观锁与悲观锁
  • 什么是悲观锁和乐观锁
    什么是悲观锁和乐观锁?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 悲观锁(Pessimistic Lock), 顾...
    99+
    2022-10-18
  • 悲观锁和乐观锁是什么
    悲观锁和乐观锁是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。乐观锁( Optimistic Locking )乐观锁( ...
    99+
    2022-10-18
  • 悲观锁与乐观锁怎么利用Hibernate实现
    这篇文章将为大家详细讲解有关悲观锁与乐观锁怎么利用Hibernate实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。四种隔离机制不要忘记:(1,2,4,8)1.read-uncommitt...
    99+
    2023-05-31
    hibernate 悲观锁 乐观锁
  • 悲观锁与乐观锁怎么在Mysql中使用
    悲观锁与乐观锁怎么在Mysql中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。悲观锁悲观锁,认为数据是悲观的。当我们查询数据的时候加上...
    99+
    2022-10-18
  • MySQL悲观锁与乐观锁如何实现
    这篇文章主要为大家展示了“MySQL悲观锁与乐观锁如何实现”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL悲观锁与乐观锁如何实现”这篇文章吧。前言悲观锁和乐观锁是用来解决并发问题的两种思...
    99+
    2023-06-25
  • Java悲观锁和乐观锁机制是什么
    本篇内容主要讲解“Java悲观锁和乐观锁机制是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java悲观锁和乐观锁机制是什么”吧!1、锁机制简介并发编程中一个最关键的问题,多线程并发处理同一...
    99+
    2023-06-02
  • 什么是乐观锁、悲观锁和MVCC
    本篇内容主要讲解“什么是乐观锁、悲观锁和MVCC”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是乐观锁、悲观锁和MVCC”吧!在数据库的实际使用过程中,我们...
    99+
    2022-10-18
  • Mysql中悲观锁与乐观锁应用介绍
    目录1.锁2.悲观锁3.乐观锁4.如何选择1.锁 ​ 生活中:锁在我们身边无处不在,比如我出门玩去了需要把门锁上,比如我需要把钱放到保险柜里面,必须上锁以保证我财产的安全。 代码中:比如多个线程需要同时操作修改共享变量,...
    99+
    2022-08-18
    Mysql悲观锁与乐观锁 Mysql悲观锁 Mysql乐观锁
  • MySQL悲观锁与乐观锁的实现方案
    目录前言实战 1、无锁2、悲观锁3、乐观锁总结前言 悲观锁和乐观锁是用来解决并发问题的两种思想,在不同的平台有着各自的实现。例如在Java中,synchronized就可以认为是悲观...
    99+
    2022-11-12
  • java中悲观锁和乐观锁有什么区别
    本篇文章给大家分享的是有关java中悲观锁和乐观锁有什么区别,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java可以用来干什么Java主要应用于:1. web开发;2. An...
    99+
    2023-06-14
  • MySQL中乐观锁和悲观锁是什么
    这篇文章给大家分享的是有关MySQL中乐观锁和悲观锁是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。数据库管理系统中并发控制的任务是确保在多个事务同时存取数据库中同一数据不破...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作