mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
Merge pull request #2312 from smy1999/feat-cas
Fix issues with optimistic locking.
This commit is contained in:
commit
ecbcf265ae
@ -285,9 +285,9 @@ public final native boolean compareAndSwapLong(Object o, long offset, long expec
|
|||||||
|
|
||||||
关于 `Unsafe` 类的详细介绍可以看这篇文章:[Java 魔法类 Unsafe 详解 - JavaGuide - 2022](https://javaguide.cn/java/basis/unsafe.html) 。
|
关于 `Unsafe` 类的详细介绍可以看这篇文章:[Java 魔法类 Unsafe 详解 - JavaGuide - 2022](https://javaguide.cn/java/basis/unsafe.html) 。
|
||||||
|
|
||||||
### 乐观锁存在哪些问题?
|
### CAS 算法存在哪些问题?
|
||||||
|
|
||||||
ABA 问题是乐观锁最常见的问题。
|
ABA 问题是 CAS 算法最常见的问题。
|
||||||
|
|
||||||
#### ABA 问题
|
#### ABA 问题
|
||||||
|
|
||||||
|
@ -122,9 +122,9 @@ public final native boolean compareAndSwapLong(Object o, long offset, long expec
|
|||||||
|
|
||||||
关于 `Unsafe` 类的详细介绍可以看这篇文章:[Java 魔法类 Unsafe 详解 - JavaGuide - 2022](https://javaguide.cn/java/basis/unsafe.html) 。
|
关于 `Unsafe` 类的详细介绍可以看这篇文章:[Java 魔法类 Unsafe 详解 - JavaGuide - 2022](https://javaguide.cn/java/basis/unsafe.html) 。
|
||||||
|
|
||||||
## 乐观锁存在哪些问题?
|
## CAS 算法存在哪些问题?
|
||||||
|
|
||||||
ABA 问题是乐观锁最常见的问题。
|
ABA 问题是 CAS 算法最常见的问题。
|
||||||
|
|
||||||
### ABA 问题
|
### ABA 问题
|
||||||
|
|
||||||
@ -165,7 +165,7 @@ CAS 只对单个共享变量有效,当操作涉及跨多个共享变量时 CAS
|
|||||||
- 高并发的场景下,激烈的锁竞争会造成线程阻塞,大量阻塞线程会导致系统的上下文切换,增加系统的性能开销。并且,悲观锁还可能会存在死锁问题,影响代码的正常运行。乐观锁相比悲观锁来说,不存在锁竞争造成线程阻塞,也不会有死锁的问题,在性能上往往会更胜一筹。不过,如果冲突频繁发生(写占比非常多的情况),会频繁失败和重试,这样同样会非常影响性能,导致 CPU 飙升。
|
- 高并发的场景下,激烈的锁竞争会造成线程阻塞,大量阻塞线程会导致系统的上下文切换,增加系统的性能开销。并且,悲观锁还可能会存在死锁问题,影响代码的正常运行。乐观锁相比悲观锁来说,不存在锁竞争造成线程阻塞,也不会有死锁的问题,在性能上往往会更胜一筹。不过,如果冲突频繁发生(写占比非常多的情况),会频繁失败和重试,这样同样会非常影响性能,导致 CPU 飙升。
|
||||||
- 乐观锁一般会使用版本号机制或 CAS 算法实现,CAS 算法相对来说更多一些,这里需要格外注意。
|
- 乐观锁一般会使用版本号机制或 CAS 算法实现,CAS 算法相对来说更多一些,这里需要格外注意。
|
||||||
- CAS 的全称是 **Compare And Swap(比较与交换)** ,用于实现乐观锁,被广泛应用于各大框架中。CAS 的思想很简单,就是用一个预期值和要更新的变量值进行比较,两值相等才会进行更新。
|
- CAS 的全称是 **Compare And Swap(比较与交换)** ,用于实现乐观锁,被广泛应用于各大框架中。CAS 的思想很简单,就是用一个预期值和要更新的变量值进行比较,两值相等才会进行更新。
|
||||||
- 乐观锁的问题:ABA 问题、循环时间长开销大、只能保证一个共享变量的原子操作。
|
- CAS 算法的问题:ABA 问题、循环时间长开销大、只能保证一个共享变量的原子操作。
|
||||||
|
|
||||||
## 参考
|
## 参考
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user