一、乐观锁:
1. 总是假设最好的情况,进行业务操作的时候不加锁
2. 只有在更新操作时,才回去判断数据是否被别的线程更新过
3. 适合读操作比较多的场景,提高系统吞吐量;写操作比较多的场景会降低性能
4. 实现方式
a. 版本号或者时间戳:表里多加一列作为标记,先读取标记,更新的时候也更新标记,如果发现版本号不是刚才读取的数据,说明被其他线程更新过,做异常处理
b. CAS:无锁编程,但会有ABA问题
二、悲观锁:
1. 总是假设最坏的情况,每次操作数据的时候,都会假设别的线程会修改数据,就先获取锁,再进行业务操作
2. 读数据的情况也加锁,系统吞吐量比较低;适合写操作比较多的场景
3. 关系型数据库实现:行锁、表锁、读锁、写锁
4. Java实现:synchronized、Lock
参考: