Skip to content

Commit b70165d

Browse files
更新线程相关内容
1 parent 3d011ad commit b70165d

9 files changed

Lines changed: 83 additions & 63 deletions

并发编程/A.锁/0.0 Java SE1.6中的Synchronized.md

Lines changed: 77 additions & 61 deletions
Large diffs are not rendered by default.
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ Java 中往往是按照是否含有某一特性来定义锁,我们通过特性
2323

2424
![](images/640-20210831162419700.jpeg)
2525

26+
27+
2628
根据从上面的概念描述我们可以发现:
2729

2830
* 悲观锁适合写操作多的场景,先加锁可以保证写操作时数据正确。
@@ -34,6 +36,8 @@ Java 中往往是按照是否含有某一特性来定义锁,我们通过特性
3436

3537
![](images/640-20210831162418127.jpeg)
3638

39+
40+
3741
通过调用方式示例,我们可以发现悲观锁基本都是在显式的锁定之后再操作同步资源,而乐观锁则直接去操作同步资源。那么,为何乐观锁能够做到不锁定同步资源也可以正确的实现线程同步呢?我们通过介绍乐观锁的主要实现方式 “CAS” 的技术原理来为大家解惑。
3842

3943
CAS 全称 Compare And Swap(比较与交换),是一种无锁算法。在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。java.util.concurrent 包中的原子类就是通过 CAS 来实现了乐观锁。
@@ -66,6 +70,8 @@ CAS 算法涉及到三个操作数:
6670

6771
![](images/640-20210831162418290.jpeg)
6872

73+
74+
6975
根据 OpenJDK 8 的源码我们可以看出,getAndAddInt()循环获取给定对象 o 中的偏移量处的值 v,然后判断内存值是否等于 v。如果相等则将内存值设置为 v + delta,否则返回 false,继续循环进行重试,直到设置成功才能退出循环,并且将旧值返回。整个 “比较 + 更新” 操作封装在 compareAndSwapInt()中,在 JNI 里是借助于一个 CPU 指令完成的,属于原子操作,可以保证多个线程都能够看到同一个变量的修改值。
7076

7177
后续 JDK 通过 CPU 的 cmpxchg 指令,去比较寄存器中的 A 和 内存中的值 V。如果相等,就把要写入的新值 B 存入内存中。如果不相等,就将内存值 V 赋值给寄存器中的值 A。然后通过 Java 代码中的 while 循环再次调用 cmpxchg 指令进行重试,直到设置成功为止。
@@ -352,5 +358,3 @@ tryAcquire() 除了重入条件(当前线程为获取了写锁的线程)之
352358
[Java8 系列之重新认识 HashMap](http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745258&idx=1&sn=df5ffe0fd505a290d49095b3d794ae7a&scene=21#wechat_redirect)
353359

354360
[Java Hotspot G1 GC 的一些关键技术](http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745420&idx=1&sn=216fec6d077716cab75d77ff162f8a71&chksm=bd12b5c18a653cd76d8e1e404dca80adae846b3df48a44af63ef9bdd2d26b24b1eb01f760542&scene=21#wechat_redirect)
355-
356-
![](images/640-20210831162419662.jpeg)
38.5 KB
Loading
52.2 KB
Loading
45.1 KB
Loading
72.7 KB
Loading
91.5 KB
Loading

并发编程/A.锁/images/640.jpeg

72.1 KB
Loading
-716 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)