- title: 乐观锁 VS 悲观锁
- date: 2021/8/15
文章目录
1. 乐观锁 vs 悲观锁
乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有对此概念对应的实际应用;
悲观锁:对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此无论共享的数据是否会出现竞争,它都会进行加锁(这里讨论的是概念模型,实际上虚拟机会优化掉很大一部分不必要的加锁(锁消除))。Java中,synchronized关键字和Lock的实现类都是悲观锁。
Java中的悲观锁就是Synchronized , AQS框架下的锁则是先尝试CAS乐观锁去获取锁,获取不到,才会转换为悲观锁,如RetreenLock。
乐观锁:乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后执行比较跟上一次的版本号,如果一样则更新,如果失败则要重复读-比较-写的操作。
乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的。

参考资料:
- 不可不说的Java“锁”事 - 美团技术团队 (meituan.com)
- 《深入理解Java虚拟机》
本文探讨了Java中的乐观锁和悲观锁概念。悲观锁在多线程环境中倾向于预先锁定资源,如synchronized和Lock实现,而乐观锁假设并发冲突少,通常使用CAS算法,在更新时检查是否有冲突。Java原子类中的递增操作即为乐观锁的一个实例。
658

被折叠的 条评论
为什么被折叠?



