什么是乐观锁,什么是悲观锁?

简介: 在互联网公司面试中,很多小伙伴都被问到关于锁的理解。今天,我给小伙伴们来聊一聊我对锁的理解,不管我们互斥锁、自旋锁、重入锁、读写锁、行锁、表锁等等等等这些概念,我把他们都归纳为两种类型,乐观锁和悲观锁。

在互联网公司面试中,很多小伙伴都被问到关于锁的理解。今天,我给小伙伴们来聊一聊我对锁的理解,不管我们互斥锁、自旋锁、重入锁、读写锁、行锁、表锁等等等等这些概念,我把他们都归纳为两种类型,乐观锁和悲观锁。


彻底讲明白Java中眼花缭乱的各种并发锁

https://gupaoedu-tom.blog.csdn.net/article/details/127854146

1、锁的定义

1)乐观锁


首先来看乐观锁,顾名思义,乐观锁就是持比较乐观态度的锁。就是在操作数据时非常乐观,认为别的线程不会同时修改数据,所以不会上锁,但是在更新的时候会判断在此期间别的线程有没有更新过这个数据。


2)悲观锁


反之,悲观锁就是持悲观态度的锁。就在操作数据时比较悲观,每次去拿数据的时候认为别的线程也会同时修改数据,所以每次在拿数据的时候都会上锁,这样别的线程想拿到这个数据就会阻塞直到它拿到锁。

2、如何理解锁

c54f01a05d4139629a87e156170d401a.jpg

举个例子,有时候我们上公共厕所的时候要排队。如果你蹲马桶的时候开着门,外面有人排着队看着你。你会这么做吗?当然,如果在自己家里,有可能会这么干,这就是乐观锁。虽然,能进到房间,但是有人占着坑位,该排队还是得排队。比如数据库提供的类似于write_condition机制,Java API 并发工具包下面的原子变量类就是使用了乐观锁的CAS来实现的。


悲观锁就不同了,就相当于是进房间之后,第一件事就是把门锁上,那在门外排队等候的人不知道里面发生了什么,又着急但是又只能干等着,这就是悲观锁。比如行锁、表锁、读锁、写锁,都是在操作之前先上锁,Java API中的synchronized和ReentrantLock等独占锁都是悲观锁思想的实现。

3、锁的应用场景

根据前面对两种锁的介绍,总结一下两种锁的应用场景:


首先来看乐观锁,它适用于写少读多的情况,也就是说减少操作冲突,这样可以省去锁竞争的开销,提高系统的吞吐量。


而悲观锁呢,它适用于写多读少的情况。因为,如果还使用乐观锁的话,会经常出现操作冲突,这样会导致应用层会不断地Retry,反而会降低系统性能。


说了这么多,小伙伴们思考一下,你认为秒杀场景下,并发下单和支付应该使用什么锁?


彻底讲明白Java中眼花缭乱的各种并发锁

https://gupaoedu-tom.blog.csdn.net/article/details/127854146


完整版面试资料和答案以及PDF文档 :

9106b97c16b34d06af118b23d081cde9.gif


相关文章
|
1月前
|
消息中间件 安全 Java
什么是乐观锁、在哪用过乐观锁
什么是乐观锁、在哪用过乐观锁
29 0
|
4月前
|
SQL 数据处理 数据库
乐观锁和悲观锁
乐观锁和悲观锁
37 0
|
21天前
|
安全 Java 关系型数据库
乐观锁与悲观锁
【4月更文挑战第11天】乐观锁与悲观锁
15 3
|
3月前
|
关系型数据库 MySQL 数据处理
一文彻底理解乐观锁与悲观锁
一文彻底理解乐观锁与悲观锁
88 0
|
5月前
|
安全 关系型数据库 MySQL
悲观锁和乐观锁
悲观锁和乐观锁
|
8月前
|
负载均衡 Java
聊到悲观锁,是用什么来实现的呢?
优惠券服务是多实例部署形成的负载均衡集群
28 0
|
9月前
|
算法
悲观锁和乐观锁的区别
悲观锁和乐观锁的区别
199 0
|
10月前
|
XML 前端开发 Java
案例突破——悲观锁和乐观锁
案例突破——悲观锁和乐观锁
99 0
案例突破——悲观锁和乐观锁
|
10月前
|
NoSQL 算法 Java
乐观锁与悲观锁的实现
本文力求来通俗地讲讲编程中的乐观锁和悲观锁,以及分别是怎么实现的。
65 0
乐观锁与悲观锁的实现
|
11月前
|
数据库
【乐观锁与悲观锁】—— 每天一点小知识
【乐观锁与悲观锁】—— 每天一点小知识