写点什么

Java 中的悲观锁和乐观锁是什么意思?其分类依据是啥?

作者:wljslmz
  • 2022 年 9 月 30 日
    江苏
  • 本文字数:1071 字

    阅读完需:约 4 分钟

Java中的悲观锁和乐观锁是什么意思?其分类依据是啥?

相信很多 Java 开发的朋友都会被 java 中的各种锁所迷惑,你是不是经常听到“可重入锁”、“互斥锁”、“轻量级锁”等关键词,其实 Java 中的锁的分类很多,不过这种分类都是针对场景的,好多人分不清或者记不住,是因为不知道这些锁为啥是这样的分类,本文瑞哥就用简洁的语言带大家走入 Java 中的锁,让我们直接开始!

一、锁的分类

Java 中的锁都是根据其特性进行分类的,我这边先给出分类的思维导图,然后我会一一讲解:



如图所示,我将锁分成了 6 类,那么每种分类的依据是什么?请往下看。

二、悲观锁 vs 乐观锁

2.1 悲观锁

悲观锁,“悲观”一词就解释了一切,我们在生活中常常回说“XX 太悲观”,那么悲观的人心思都很重,很多时候如果事情不能 100%成功,那么他都不会去尝试,做事前首先想到的就是事情假如失败了怎么办。


在 java 中,悲观锁也很像生活中悲观的人,悲观锁是这样的,假如有多个线程去访问同一个资源,当第一个线程访问的时候,因为是悲观锁,所以太怕出意外情况,因此系统会直接锁住这个资源,直到第一个线程释放锁,这就是悲观锁。


悲观锁提供了更好的数据完整性,但是锁的管理更难,如果您无法管理它,您的应用程序可能会遇到死锁

2.2 乐观锁

乐观锁,字面意思“乐观”,想象一下生活中那些乐观的人,他们总是将事情想的很顺利,对什么事情都是往好的方向想,一般都是这样:管他呢,啥后果不后果的,万一成功了呢,先干再说。


在 java 中,乐观锁也很像生活中乐观的人,乐观锁是这样的,多个线程访问某个资源的时候,当第一个线程访问该资源的时候,它认为不会有其他线程(不考虑其他事情,认为什么都是好的)修改该资源,所以不会加锁,但是不加锁不代表没有任何操作,它会先判断一下这个资源有没有被其他线程修改过,如果没有修改,那么它就不管不顾的操作该资源,如果判断出被修改过,那么会执行其他操作,这个根据情况来看,一般就是重试或者直接抛出错误。


在大多数情况下,乐观锁定更有效并提供更高的性能


2.3 分类依据

看完我上面对悲观锁和乐观锁的描述,你是不是已经直到分类的依据了呢?


不错,就是线程间是否需要锁住资源:需要锁住就是悲观锁,不需要锁住就是乐观锁。

2.4 悲观锁和乐观锁的使用场景

  • 如果有大量更新并且用户尝试同时更新数据的机会相对较高,则悲观锁定很有用。

  • 如果发生冲突的可能性非常低,乐观锁定很有用。

三、总结

本文主要介绍了悲观锁和乐观锁,其分类的依据就是线程间是否需要锁住资源需要锁住就是悲观锁,不需要锁住就是乐观锁。


希望本文对您认识悲观锁和乐观锁有所帮助,在阅读的同时有任何疑问可以在下方评论区与我讨论,下一篇文章,将带您了解一下自旋锁和应性自旋锁。

发布于: 刚刚阅读数: 3
用户头像

wljslmz

关注

极致主义者,追求技术的路上,勇往直前! 2021.05.24 加入

公众号:网络技术联盟站 👍InfoQ签约作者 👍阿里云社区签约作者 👍华为云 云享专家 👍BOSS直聘 创作王者 👍腾讯课堂创作领航员 博客+论坛:https://www.wljslmz.cn 工程师导航:https://www.wljslmz.com

评论

发布
暂无评论
Java中的悲观锁和乐观锁是什么意思?其分类依据是啥?_Java_wljslmz_InfoQ写作社区