欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

乐观锁和悲观锁的原理及应用场景

程序员文章站 2024-01-08 08:52:28
...

一、乐观锁和悲观锁的策略

1.悲观锁

(1)每次去拿数据都会认为别人会修改,所以每次拿数据的时候都会上锁。比如:行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。

2.乐观锁

(1)每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,如果发生冲突了,则返回用户的错误信息,让用户决定如何去做。(适用于多读的类型,并发大的情况。一般基于数据版本号实现)

(2)冲突检测和数据更新(版本号机制实现)

在数据表中加上一个数据版本号version字段,表示数据被修改的次数,数据被修改时version值会加1,当更新数据时,刚才读到的version值和数据库中的version值相等才可以更新。

update table set x=x+1, version=version+1 where id=#{id} and version=#{version};

(3)CAS(compare and swap)实现

多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新值,其他的线程失败,但不会被挂起,而是被告知这次竞争失败,并可以再次尝试。

CAS 操作原理:

CAS 操作中包含三个操作数 —— 需要读写的内存位置(V)、进行比较的预期原值(A)和拟写入的新值(B)。如果内存位置V的值与预期原值A相匹配,那么处理器会自动将该位置值更新为新值B。否则处理器不做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该位置的值。

上一篇:

下一篇: