【java扩展】——乐观锁和悲观锁

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

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

 

乐观锁

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

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

悲观锁

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

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

适用场景

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

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

参考网址

posted @ 2022-09-29 19:19  陆陆无为而治者  阅读(82)  评论(0编辑  收藏  举报