开发者社区> 问答> 正文

乐观锁悲观锁区别是什么?

乐观锁悲观锁区别是什么?

本问题来自阿里云开发者社区的【11大垂直技术领域开发者社群】。 点击链接欢迎加入感兴趣的技术领域群。

展开
收起
游客pklijor6gytpx 2019-11-11 15:02:06 7013 0
3 条回答
写回答
取消 提交回答
  • 悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。

    乐观锁 总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。

    2020-08-03 21:24:56
    赞同 展开评论 打赏
  • 悲观锁(Pessimistic Lock) 在每次拿数据时都会上锁,传统的关系型数据库里边经常用到用到比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,主要依靠数据库提供的锁机制。

    乐观锁(Optimistic Lock) 每次拿数据的时候都不会上锁,在更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁适用于多读的应用类型,这样可以提高吞吐量。

    区别 两种锁各有优缺点,乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。悲观锁适用于经常产生冲突,上层应用会不断的进行retry。

    2019-11-26 11:35:33
    赞同 1 展开评论 打赏
  • 实现数据版本有两种方式,第一种是使用版本号,第二种是使用时间戳。

    2019-11-11 15:02:44
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载