最近,学习Mybatis-plus时,用到了乐观锁的插件。然后,我就对乐观锁和悲观锁进行了了解。

我发现,有一张图片很能反应乐观锁和悲观锁的区别。

 

java中悲观锁和乐观锁 悲观锁与乐观_乐观锁

乐观锁

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

那么,当存在更新冲突时,后提交更新的数据因为找不到正确的版本号,所以无法更新。但是,冲突的数据可以根据反馈的结果,再次做出更新或其他。

java中悲观锁和乐观锁 悲观锁与乐观_java中悲观锁和乐观锁_02

悲观锁

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

当存在更新冲突的时候。悲观锁,必须等到上一个操作执行完成,才能继续执行。

适用场景

乐观锁。减少操作冲突,省去竞争开销,提高吞吐量。适合写多读少的情况。

悲观锁。适合写多读少的情况。如果写操作特别多,继续使用乐观锁,会使得操作不断重复,反而降低性能。

    有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。