关于java:面试中的最常被问到的两种锁

50次阅读

共计 1933 个字符,预计需要花费 5 分钟才能阅读完成。

面试中常常被问到的锁到底是哪两种锁呢? 接下来咱们就得介绍下乐观锁和乐观锁了。那咱们我就来理解一波吧!

锁的分类

1. 偏心锁 / 非偏心锁

2. 可重入锁

3. 独享锁 / 共享锁

4. 互斥锁 / 读写锁

5. 乐观锁 / 乐观锁

6. 分段锁

7. 偏差锁 / 轻量级锁 / 重量级锁 8. 自旋锁

乐观锁

所谓的乐观,实际上是绝对于乐观锁来说,咱们先看一下百度百科中的解释。

乐观锁机制采取了更加宽松的加锁机制。乐观锁大多数状况下依附数据库的锁机制实现,以保障操作最大水平的独占性。但随之而来的就是数据库 性能的大量开销,特地是对长事务而言,这样的开销往往无奈接受。绝对乐观锁而言,乐观锁更偏向于开发使用。

下面的内容都是乐观锁在百度百科中的解释,咱们如果想要了解这个锁,是须要咱们去找一个场景来进行解释的。

咱们就从最经典的案例“老王取钱”来说,

图中有三个存在,别离示意老王,和老王账户,还有一个就是版本信息。版本信息默认是 1, 这时候老王要买点货色,后果发现钱不太够,那就去银行取点钱去呗,果决的来了银行。

而后通知柜员,取 5000 块钱,而后柜员就会从他的账户余额外面扣除 5000,就是 -5000

这时候版本信息是 1,然而咱们对金额做了批改之后,要把版本信息换成 2,因为当初保留的版本信息是 1,柜员查看的时候也是 1,老王取钱了,就想着批改成 2。

然而,就在这个时候,来事了,老王的媳妇进来买衣服,发现身上钱不太够,就打算取点钱,就来了另外一家银行,这时候老王钱拿到了,然而柜员还没批改版本信息

就是这样子的,

这时候通知柜员要取钱,柜员就回去读卡了,发现版本信息是 1,

而后就在这时候,老王这头,柜员打算把这 -5000 的操作记录到数据库中,而后把版本信息变成 2,这时候校验数据库中的版本信息还是 1,所以,录入胜利了,就稳固的把这个信息改成了 2,

这时候就是这样的

钱也到手了,老王美滋滋的拿钱走了。

而后在老王媳妇这边的柜员在操作的时候就会呈现问题了,之前读出来的账户信息版本是 1,然而他要去操作的时候,发现不对呀,有人批改过呀,就会呈现这种状况。

然而他想去批改的时候人家当初默认的是 2,这时候他在比对的时候是 1 和 2 了,而后就想着在次提交,这时候,操作实现不了,这就太难堪了

这种状况就是证实不能让老王媳妇这边的柜员,拿着一版本的数据去吧老王那边的数据笼罩掉。这种其实就相当于是一种乐观锁的提现。

下面的图解就是乐观锁,

乐观锁,大多是基于数据版本(Version)记录机制实现。何谓数据版本?即为数据减少一个版本标识,在基于数据库表的版本解决方案中,个别是通过为数据库表减少一个“version”字段来实现。读取出数据时,将此版本号一起读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的以后版本信息进行比对,如果提交的数据版本号大于数据库表以后版本号,则予以更新,否则认为是过期数据。

那什么又是乐观锁呢?咱们接下来在说说什么是乐观锁。

乐观锁

常规,先来看看百度百科中的解释

乐观锁,正如其名,具备强烈的独占和排他个性。

它指的是对数据被外界(包含本零碎以后的其余事务,以及来自内部零碎的事务处理)批改持激进态度,因而,在整个数据处理过程中,将数据处于锁定状态。乐观锁的实现,往往依附数据库提供的锁机制(也只有数据库层提供的锁机制能力真正保证数据拜访的排他性,否则,即便在本零碎中实现了加锁机制,也无奈保障内部零碎不会批改数据)。

因为乐观锁总是假如最坏的状况,每次去拿数据的时候都认为他人会批改,所以每次在拿数据的时候都会上锁,这样他人想拿这个数据就会阻塞直到它拿到锁。

案例来袭:“工资的那点事”

这天老王开工资了,工资曾经到账了,这时候老王没开短信揭示,得去看看钱到还是没到?

而后就通知柜员,帮我查查卡里有多少钱?

正在柜员查钱的时候,老王媳妇又来取钱了,上次买的衣服不难看,再买点,钱不够就来银行了。

这时候老王正在查钱,而乐观锁的意思就是我在读的时候,我是锁着的你是看不到的,能够这么了解。

这时候老王媳妇就处于期待的状态,这个样子就是相当于乐观锁。

因为乐观锁就是当咱们去获取数据的时候,不管咱们有没有打算去批改,乐观锁都会认为咱们肯定会去批改这个数据,所以 他会把这个数据间接锁死,其余的人想操作操作,那你就阻塞,直到轮到你获取锁为止。

乐观锁和乐观锁的区别也就在这里。

乐观锁 总是认为不会产生并发问题,每次去取数据的时候总认为不会有其余线程对数据进行批改,因而不会上锁,然而在更新时会判断其余线程在这之前有没有对数据进行批改,个别会应用版本号机制或 CAS 操作实现。

乐观锁总是假如最坏的状况,每次取数据时都认为其余线程会批改,所以都会加锁(读锁、写锁、行锁等),当其余线程想要拜访数据时,都须要阻塞挂起

对于乐观锁和乐观锁,你理解了么?

正文完
 0