必备知识点:乐观锁和悲观锁的区别
本篇文章,小编用提问于解答的形式,给读者呈现最佳阅读、学习体验:
请问乐观锁和悲观锁的区别是什么?为什么叫这个名字?
答:乐观锁表示不加锁,直接读取数据。就好像开发者乐观地以为读的过程中不会有写入。因为实际项目中,读操作比写操作频繁很多,所以大多数情况下我们可以选择乐观。但为了安全,我们还需要在乐观读取后做一个检查,保证数据正确。悲观锁表示读取时为了安全直接加锁,就好像开发者悲观地认为这次读取不加锁一定是不安全的。
CAS也是一种乐观锁,对CAS有了解吗?
答:CAS 表示 compare and swap,也有人说是 compare and set,compare and exchange。CAS 操作包含三个操作数:需要读写的内存位置(V)、预期值(E)和新值(N)。操作的逻辑是:
- 比较内存位置 V 中的当前值是否等于预期值 E。
- 如果相等,则将内存位置 V 的值更新为新值 N;如果不相等,则操作失败,重新尝试。
- CAS 底层原理是什么?
答:CAS 底层是通过硬件指令,实现比较和交换操作。如 x86 架构下,执行的是 cmpxchg (读作 compare and exchange)指令,但这个指令不是原子性的,在多线程环境下,还需要执行 lock 指令保证 CAS 操作的原子性。
