From 60a1d0b3cb286d60ae103acf77f06e0e325f3701 Mon Sep 17 00:00:00 2001 From: MalikCheng <1484392767@qq.com> Date: Sat, 10 Aug 2019 19:40:41 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=AE=B5=E8=90=BD=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=EF=BC=8C=E4=BD=8D=E7=BD=AE=EF=BC=8C=E7=A7=BB=E5=88=B0?= =?UTF-8?q?=E9=9D=9E=E9=98=BB=E5=A1=9E=E5=90=8C=E6=AD=A5=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E4=B8=8B=E6=9B=B4=E5=8A=A0=E5=90=88=E7=90=86=E6=98=93=E7=90=86?= =?UTF-8?q?=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "notes/Java \345\271\266\345\217\221.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/notes/Java \345\271\266\345\217\221.md" "b/notes/Java \345\271\266\345\217\221.md" index 2b79c5ae..357e8248 100644 --- "a/notes/Java \345\271\266\345\217\221.md" +++ "b/notes/Java \345\271\266\345\217\221.md" @@ -1329,10 +1329,10 @@ synchronized 和 ReentrantLock。 互斥同步属于一种悲观的并发策略,总是认为只要不去做正确的同步措施,那就肯定会出现问题。无论共享数据是否真的会出现竞争,它都要进行加锁(这里讨论的是概念模型,实际上虚拟机会优化掉很大一部分不必要的加锁)、用户态核心态转换、维护锁计数器和检查是否有被阻塞的线程需要唤醒等操作。 -### 1. CAS - 随着硬件指令集的发展,我们可以使用基于冲突检测的乐观并发策略:先进行操作,如果没有其它线程争用共享数据,那操作就成功了,否则采取补偿措施(不断地重试,直到成功为止)。这种乐观的并发策略的许多实现都不需要将线程阻塞,因此这种同步操作称为非阻塞同步。 +### 1. CAS + 乐观锁需要操作和冲突检测这两个步骤具备原子性,这里就不能再使用互斥同步来保证了,只能靠硬件来完成。硬件支持的原子性操作最典型的是:比较并交换(Compare-and-Swap,CAS)。CAS 指令需要有 3 个操作数,分别是内存地址 V、旧的预期值 A 和新值 B。当执行操作时,只有当 V 的值等于 A,才将 V 的值更新为 B。 ### 2. AtomicInteger -- GitLab