Skip to content

Commit 78603ac

Browse files
committed
📝 Writing docs.
1 parent 868604a commit 78603ac

7 files changed

Lines changed: 281 additions & 67 deletions

File tree

docs/concurrent/Java原子操作类.md

Lines changed: 0 additions & 54 deletions
This file was deleted.

docs/concurrent/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
* [x] [并发简介](并发简介.md)
66
* [x] [线程基础](线程基础.md)
7-
* [x] [Java 并发机制的底层实现](Java并发机制的底层实现.md)
8-
* [x] [Java 内存模型](Java内存模型.md)
7+
* [x] [并发机制的底层实现](并发机制的底层实现.md)
8+
* [x] [内存模型](内存模型.md)
99
* [x] [同步容器和并发容器](同步容器和并发容器.md)
10-
* [x] [Java ](Java锁.md)
11-
* [x] [Java 原子操作类](Java原子操作类.md)
12-
* [x] [Java 并发工具类](Java并发工具类.md)
10+
* [x] [](.md)
11+
* [x] [原子变量类](原子变量类.md)
12+
* [x] [并发工具类](并发工具类.md)
1313
* [x] [线程池](线程池.md)
1414
* [x] [Java 并发面试](Java并发面试.md)
1515
* [x] [并发术语](并发术语.md)
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
ngtitle: Java 内存模型
2+
ngtitle: 内存模型
33
date: 2018/05/19
44
categories:
55
- javase
@@ -8,7 +8,7 @@ tags:
88
- concurrent
99
---
1010

11-
# Java 内存模型
11+
# 内存模型
1212

1313
> 本文内容基于 JDK1.8。
1414
>

docs/concurrent/原子变量类.md

Lines changed: 268 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,268 @@
1+
---
2+
title: 原子变量类
3+
date: 2018/05/18
4+
categories:
5+
- javase
6+
tags:
7+
- javase
8+
- concurrent
9+
- juc
10+
---
11+
12+
# 原子变量类
13+
14+
> 本文内容基于 JDK1.8。
15+
16+
<!-- TOC depthFrom:2 depthTo:4 -->
17+
18+
* [原子更新基本类型](#原子更新基本类型)
19+
* [原子更新数组](#原子更新数组)
20+
* [原子更新引用类型](#原子更新引用类型)
21+
* [原子更新字段类](#原子更新字段类)
22+
* [资料](#资料)
23+
24+
<!-- /TOC -->
25+
26+
原子变量比锁的粒度更细,量级更轻,并且对于在多处理器系统上实现高性能的并发代码来说是非常关键的。
27+
28+
原子变量类相当于一种泛化的volatile变量,能够支持原子的和有条件的读-改-写操作。
29+
30+
原子类在内部使用现代 CPU 支持的 CAS 指令来实现同步。这些指令通常比锁更快。
31+
32+
## 原子更新基本类型
33+
34+
* AtomicBoolean - 原子更新布尔类型。
35+
* AtomicInteger - 原子更新整型。
36+
* AtomicLong - 原子更新长整型。
37+
38+
示例:
39+
40+
```java
41+
public class AtomicIntegerDemo {
42+
43+
public static void main(String[] args) throws InterruptedException {
44+
ExecutorService executorService = Executors.newFixedThreadPool(5);
45+
AtomicInteger count = new AtomicInteger(0);
46+
for (int i = 0; i < 1000; i++) {
47+
executorService.submit((Runnable) () -> {
48+
System.out.println(Thread.currentThread().getName() + " count=" + count.get());
49+
count.incrementAndGet();
50+
});
51+
}
52+
53+
executorService.shutdown();
54+
executorService.awaitTermination(30, TimeUnit.SECONDS);
55+
System.out.println("Final Count is : " + count.get());
56+
}
57+
}
58+
```
59+
60+
## 原子更新数组
61+
62+
* AtomicIntegerArray - 原子更新整型数组里的元素。
63+
* AtomicLongArray - 原子更新长整型数组里的元素。
64+
* AtomicReferenceArray - 原子更新引用类型数组的元素。
65+
* AtomicBooleanArray - 原子更新布尔类型数组的元素。
66+
67+
示例:
68+
69+
```java
70+
public class AtomicIntegerArrayDemo {
71+
72+
private static AtomicIntegerArray atomicIntegerArray = new AtomicIntegerArray(10);
73+
74+
public static void main(final String[] arguments) throws InterruptedException {
75+
76+
for (int i = 0; i < atomicIntegerArray.length(); i++) {
77+
atomicIntegerArray.set(i, i);
78+
}
79+
80+
Thread t1 = new Thread(new Increment());
81+
Thread t2 = new Thread(new Compare());
82+
t1.start();
83+
t2.start();
84+
85+
t1.join();
86+
t2.join();
87+
88+
System.out.println("Final Values: ");
89+
90+
for (int i = 0; i < atomicIntegerArray.length(); i++) {
91+
System.out.print(atomicIntegerArray.get(i) + " ");
92+
}
93+
}
94+
95+
static class Increment implements Runnable {
96+
97+
public void run() {
98+
99+
for (int i = 0; i < atomicIntegerArray.length(); i++) {
100+
int add = atomicIntegerArray.incrementAndGet(i);
101+
System.out.println(Thread.currentThread().getName() + ", index " + i + ", value: " + add);
102+
103+
}
104+
}
105+
}
106+
107+
static class Compare implements Runnable {
108+
109+
public void run() {
110+
111+
for (int i = 0; i < atomicIntegerArray.length(); i++) {
112+
boolean swapped = atomicIntegerArray.compareAndSet(i, 2, 3);
113+
114+
if (swapped) {
115+
System.out.println(Thread.currentThread().getName() + ", index " + i + ", value: 3");
116+
}
117+
}
118+
}
119+
}
120+
}
121+
```
122+
123+
## 原子更新引用类型
124+
125+
* AtomicReference - 原子更新引用类型。
126+
* AtomicReferenceFieldUpdater - 原子更新引用类型里的字段。
127+
* AtomicMarkableReference - 原子更新带有标记位的引用类型。可以原子更新一个布尔类型的标记位和应用类型。
128+
129+
```java
130+
public class AtomicReferenceDemo {
131+
132+
private static String message;
133+
private static Person person;
134+
private static AtomicReference<String> aRmessage;
135+
private static AtomicReference<Person> aRperson;
136+
137+
public static void main(String[] args) throws InterruptedException {
138+
Thread t1 = new Thread(new MyRun1());
139+
Thread t2 = new Thread(new MyRun2());
140+
message = "hello";
141+
person = new Person("Phillip", 23);
142+
aRmessage = new AtomicReference<String>(message);
143+
aRperson = new AtomicReference<Person>(person);
144+
System.out.println("Message is: " + message
145+
+ "\nPerson is " + person.toString());
146+
System.out.println("Atomic Reference of Message is: " + aRmessage.get()
147+
+ "\nAtomic Reference of Person is " + aRperson.get().toString());
148+
t1.start();
149+
t2.start();
150+
t1.join();
151+
t2.join();
152+
System.out.println("\nNow Message is: " + message
153+
+ "\nPerson is " + person.toString());
154+
System.out.println("Atomic Reference of Message is: " + aRmessage.get()
155+
+ "\nAtomic Reference of Person is " + aRperson.get().toString());
156+
}
157+
158+
static class MyRun1 implements Runnable {
159+
160+
public void run() {
161+
aRmessage.compareAndSet(message, "Thread 1");
162+
message = message.concat("-Thread 1!");
163+
person.setAge(person.getAge() + 1);
164+
person.setName("Thread 1");
165+
aRperson.getAndSet(new Person("Thread 1", 1));
166+
System.out.println("\n" + Thread.currentThread().getName() + " Values "
167+
+ message + " - " + person.toString());
168+
System.out.println("\n" + Thread.currentThread().getName() + " Atomic References "
169+
+ message + " - " + person.toString());
170+
}
171+
}
172+
173+
static class MyRun2 implements Runnable {
174+
175+
public void run() {
176+
message = message.concat("-Thread 2");
177+
person.setAge(person.getAge() + 2);
178+
person.setName("Thread 2");
179+
aRmessage.lazySet("Thread 2");
180+
aRperson.set(new Person("Thread 2", 2));
181+
System.out.println("\n" + Thread.currentThread().getName() + " Values: "
182+
+ message + " - " + person.toString());
183+
System.out.println("\n" + Thread.currentThread().getName() + " Atomic References: "
184+
+ aRmessage.get() + " - " + aRperson.get().toString());
185+
}
186+
}
187+
188+
static class Person {
189+
190+
private String name;
191+
private int age;
192+
193+
Person(String name, int age) {
194+
this.name = name;
195+
this.age = age;
196+
}
197+
198+
public String getName() {
199+
return name;
200+
}
201+
202+
public void setName(String name) {
203+
this.name = name;
204+
}
205+
206+
int getAge() {
207+
return age;
208+
}
209+
210+
void setAge(int age) {
211+
this.age = age;
212+
}
213+
214+
@Override
215+
public String toString() {
216+
return "[name " + this.name + ", age " + this.age + "]";
217+
}
218+
}
219+
}
220+
```
221+
222+
## 原子更新字段类
223+
224+
* AtomicIntegerFieldUpdater - 原子更新整型的字段的更新器。
225+
* AtomicLongFieldUpdater - 原子更新长整型字段的更新器。
226+
* AtomicStampedReference - 原子更新带有版本号的引用类型。该类将整型数值与引用关联起来,可用于原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。
227+
228+
```java
229+
public class AtomicStampedReferenceDemo {
230+
231+
private final static String INIT_REF = "abc";
232+
233+
public static void main(String[] args) throws InterruptedException {
234+
235+
AtomicStampedReference<String> asr = new AtomicStampedReference<>(INIT_REF, 0);
236+
System.out.println("初始对象为:" + asr.getReference());
237+
final int stamp = asr.getStamp();
238+
239+
ExecutorService executorService = Executors.newFixedThreadPool(100);
240+
for (int i = 0; i < 100; i++) {
241+
executorService.submit(() -> {
242+
try {
243+
Thread.sleep(Math.abs((int) (Math.random() * 100)));
244+
} catch (InterruptedException e) {
245+
e.printStackTrace();
246+
}
247+
248+
if (asr.compareAndSet(INIT_REF, Thread.currentThread().getName(), stamp, stamp + 1)) {
249+
System.out.println(Thread.currentThread().getName() + " 修改了对象!");
250+
System.out.println("新的对象为:" + asr.getReference());
251+
}
252+
});
253+
}
254+
255+
executorService.shutdown();
256+
executorService.awaitTermination(60, TimeUnit.SECONDS);
257+
}
258+
}
259+
```
260+
261+
## 资料
262+
263+
* [Java 并发编程实战](https://item.jd.com/10922250.html)
264+
* [Java 并发编程的艺术](https://item.jd.com/11740734.html)
265+
* http://tutorials.jenkov.com/java-util-concurrent/atomicinteger.html
266+
* http://tutorials.jenkov.com/java-util-concurrent/atomicintegerarray.html
267+
* http://tutorials.jenkov.com/java-util-concurrent/atomicreference.html
268+
* http://tutorials.jenkov.com/java-util-concurrent/atomicstampedreference.html
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title: Java并发工具类
2+
title: 并发工具类
33
date: 2018/05/15
44
categories:
55
- javase
@@ -9,7 +9,7 @@ tags:
99
- juc
1010
---
1111

12-
# Java 并发工具类
12+
# 并发工具类
1313

1414
> 本文内容基于 JDK1.8。
1515
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title: Java 并发机制的底层实现
2+
title: 并发机制的底层实现
33
date: 2018/05/19
44
categories:
55
- Javase
@@ -9,7 +9,7 @@ tags:
99
- juc
1010
---
1111

12-
# Java 并发机制的底层实现
12+
# 并发机制的底层实现
1313

1414
> 本文内容基于 JDK1.8。
1515

0 commit comments

Comments
 (0)