1
0
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:
Guide 2024-03-07 10:52:17 +08:00 committed by GitHub
commit ecbcf265ae
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 5 additions and 5 deletions

View File

@ -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 问题

View File

@ -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 问题、循环时间长开销大、只能保证一个共享变量的原子操作。
## 参考 ## 参考