悲观锁和乐观锁

定义:
悲观锁(Pessimistic Lock):
每次获取数据的时候,都会担心数据被修改,所以每次获取数据的时候都会进行加锁,确保在自己使用的过程中数据不会被别人修改,使用完成后进行数据解锁。由于数据进行加锁,期间对该数据进行读写的其他线程都会进行等待。

乐观锁(Optimistic Lock):
每次获取数据的时候,都不会担心数据被修改,所以每次获取数据的时候都不会进行加锁,但是在更新数据的时候需要判断该数据是否被别人修改过。如果数据被其他线程修改,则不进行数据更新,如果数据没有被其他线程修改,则进行数据更新。由于数据没有进行加锁,期间该数据可以被其他线程进行读写操作。

适用场景:
悲观锁:比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。

乐观锁:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。

总结:两种所各有优缺点,读取频繁使用乐观锁,写入频繁使用悲观锁。

原文:https://blog.csdn.net/claram/article/details/53959367

悲观锁实现:

Lock、sync等

乐观锁实现:

CAS和版本号机制
潜在问题:

  • ABA问题
  • 循环时间长开销大
  • 只能保证一个共享变量的原子操作
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 悲观锁 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所...
    忘净空阅读 785评论 0 2
  • 前文我们提到了表锁,行锁的这些概念,今天我们来谈谈mysql的悲观锁和乐观锁。何为乐观锁?顾名思义,乐观锁就是乐观...
    孙小胖2018阅读 469评论 0 0
  • 乐观锁: 总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新...
    kohlgrx阅读 304评论 0 0
  • 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数...
    whynotybb阅读 715评论 0 1
  • 张海萍 焦点网络中级八期 山西晋中 坚持分享第213天 2018年9月23日 周日 今天吃饭时,米汤很烫,一同事...
    小海儿2阅读 204评论 0 0