乐观锁和悲观锁

一、乐观锁:

1. 总是假设最好的情况,进行业务操作的时候不加锁

2. 只有在更新操作时,才回去判断数据是否被别的线程更新过

3. 适合读操作比较多的场景,提高系统吞吐量;写操作比较多的场景会降低性能

4. 实现方式

a. 版本号或者时间戳:表里多加一列作为标记,先读取标记,更新的时候也更新标记,如果发现版本号不是刚才读取的数据,说明被其他线程更新过,做异常处理

b. CAS:无锁编程,但会有ABA问题

 

二、悲观锁:

1. 总是假设最坏的情况,每次操作数据的时候,都会假设别的线程会修改数据,就先获取锁,再进行业务操作

2. 读数据的情况也加锁,系统吞吐量比较低;适合写操作比较多的场景

3. 关系型数据库实现:行锁、表锁、读锁、写锁

4. Java实现:synchronized、Lock

 

 

参考:

https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484911&idx=1&sn=1d53616437f50b353e33edad6fda2e4f&source=41#wechat_redirect

 

posted @ 2019-11-03 10:45  牧云文仔  阅读(109)  评论(0编辑  收藏  举报