本文转自https://blog.csdn.net/L_BestCoder/article/details/79298417
牢记:
- 读取频繁的时候使用乐观锁,写入频繁的时候使用悲观锁
乐观锁
- 总是认为不会产生并发问题,每次读取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁。
- 在更新时会判断其他线程在之前有没有对数据进行修改,一般使用版本号机制或者CAS操作实现
- 乐观锁适用于多读的应用类型,这样可以提高吞吐量
悲观锁
- 总是假设最坏的情况,认为每次读取数据都有其他线程会修改,所以都会加上锁,当其他线程想要访问数据,都需要阻塞挂起
- 在java中,synchronized的思想也是悲观锁
version方式
CAS操作
- 涉及到三个操作,数据所在的内存值,预期值,新值。当需要更新时,判断当前内存值和之前取到的值是否相同。若相等,则用新值更新,若失败则重试