Skip to content

Commit 0b3e651

Browse files
committed
添加 docs/10.并发多线程/02.反制面试官-再也不怕被问CAS.md
1 parent 094577b commit 0b3e651

5 files changed

Lines changed: 92 additions & 3 deletions

File tree

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.jackson0714.passjava.threads;
2+
import java.util.concurrent.atomic.AtomicInteger;
3+
/**
4+
演示CAS compareAndSet 比较并交换
5+
* @author: 悟空聊架构
6+
* @create: 2020-08-17
7+
*/
8+
public class CASDemo {
9+
public static void main(String[] args) {
10+
AtomicInteger atomicInteger = new AtomicInteger(10);
11+
Boolean result1 = atomicInteger.compareAndSet(10,20);
12+
System.out.printf("当前atomicInteger变量的值:%d 比较结果%s\r\n", atomicInteger.get(), result1);
13+
Boolean result2 = atomicInteger.compareAndSet(10,30);
14+
System.out.printf("当前atomicInteger变量的值:%d, 比较结果%s\n" , atomicInteger.get(), result2);
15+
}
16+
}

docs/10.并发多线程/01.反制面试官_14张原理图_再也不怕被问volatile!.md renamed to docs/10.并发多线程/01.反制面试官-14张原理图-再也不怕被问volatile!.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
# 絮叨
88
这一篇也算是Java并发编程的开篇,看了很多资料,但是轮到自己去整理去总结的时候,发现还是要多看几遍资料才能完全理解。还有一个很重要的点就是,画图是加深印象和检验自己是否理解的一个非常好的方法。
99

10-
# 一、Volatile怎么念?
10+
# 一、volatile怎么念?
1111

1212
![volatile怎么念](http://cdn.jayh.club/blog/20200813/143958482.png)
1313

@@ -332,9 +332,9 @@ public synchronized static void increase() {
332332

333333
但是使用synchronized太重了,会造成阻塞,只有一个线程能进入到这个方法。我们可以使用Java并发包(JUC)中的AtomicInterger工具包。
334334

335-
## 7.2 AtomicInterger原子性操作
335+
## 7.2 AtomicInteger原子性操作
336336

337-
我们来看看AtomicInterger原子自增的方法getAndIncrement()
337+
我们来看看AtomicInteger原子自增的方法getAndIncrement()
338338

339339
![AtomicInterger](http://cdn.jayh.club/blog/20200813/160301296.png)
340340

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# 反制面试官 | 再也不怕被问CAS.md
2+
3+
# 一、CAS 是什么?
4+
5+
CAS的全称是Compare-And-Swap(比较并交换)
6+
7+
CAS指令需要有三个操作数,变量的当前值,旧的预期值(A),准备设置的新值(B)。
8+
9+
CAS指令执行时,当且仅当V=A时,处理器才会设置V=B,否则不执行更新。
10+
11+
CAS的返回指:V的之前值。
12+
13+
CAS处理过程:原子操作,执行期间不会被其他线程中断。
14+
15+
# 二、能举个例子说明吗?
16+
17+
在上篇讲volatile时,讲到了如何使用原子整型类AtomicInteger来解决volatile的非原子性问题,保证多个线程执行num++的操作,最终执行的结果与单线程一致,输出结果为20000。
18+
19+
这次我们还是用AtomicInteger。
20+
21+
首先定义atomicInteger变量的初始值等于10,主内存中的值设置为10
22+
23+
```java
24+
AtomicInteger atomicInteger = new AtomicInteger(10);
25+
```
26+
27+
然后调用atomicInteger的CAS方法,先比较当前变量atomicInteger的值是否是10,如果是,则将变量的值设置为20
28+
29+
```java
30+
atomicInteger.compareAndSet(10, 20);
31+
```
32+
33+
设置成功,atomicInteger更新为20
34+
35+
当我们再次调用atomicInteger的CAS方法,先比较当前变量atomicInteger的值是否是10,如果是,则将变量的值设置为30
36+
37+
```java
38+
atomicInteger.compareAndSet(10, 30);
39+
```
40+
41+
设置失败,因atomicInteger的当前值为20,而比较值是10,所以比较后,不相等,故不能进行更新。
42+
43+
完整代码如下:
44+
45+
```java
46+
package com.jackson0714.passjava.threads;
47+
import java.util.concurrent.atomic.AtomicInteger;
48+
/**
49+
演示CAS compareAndSet 比较并交换
50+
* @author: 悟空聊架构
51+
* @create: 2020-08-17
52+
*/
53+
public class CASDemo {
54+
public static void main(String[] args) {
55+
AtomicInteger atomicInteger = new AtomicInteger(10);
56+
Boolean result1 = atomicInteger.compareAndSet(10,20);
57+
System.out.printf("当前atomicInteger变量的值:%d 比较结果%s\r\n", atomicInteger.get(), result1);
58+
Boolean result2 = atomicInteger.compareAndSet(10,30);
59+
System.out.printf("当前atomicInteger变量的值:%d, 比较结果%s\n" , atomicInteger.get(), result2);
60+
}
61+
}
62+
```
63+
64+
执行结果如下:
65+
66+
``` java
67+
当前atomicInteger变量的值:20 比较结果true
68+
当前atomicInteger变量的值:20, 比较结果false
69+
```
70+
71+
![atomicInteger比较并交换的示例结果](http://cdn.jayh.club/blog/20200818/0bMPvFoWDkew.png?imageslim)

‎docs/_sidebar.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@
4949
* 九、JVM
5050
* [01.50+道JVM面试题+11张思维导图就是让你懂JVM](09.JVM/01.50+道JVM面试题+11张思维导图就是让你懂JVM.md)
5151
* [99.字节码指令表](09.JVM/99.字节码指令表.md)
52+
* 十、并发多线程
53+
* [01.反制面试官-14张原理图-再也不怕被问volatile!](10.并发多线程/01.反制面试官-14张原理图-再也不怕被问volatile!.md)
5254
* iOS篇
5355
* [01.从零开始用swift开发一个iOS应用(仿微博)1. 第一个demo上手体验](96.iOS/02.iOS实战/01.第一个demo上手体验.md)
5456
* 工具篇

0 commit comments

Comments
 (0)