Skip to content

Commit 14cfcb2

Browse files
author
jackchan1999
committed
updates
1 parent 847bebe commit 14cfcb2

File tree

3 files changed

+64
-14
lines changed

3 files changed

+64
-14
lines changed

第5章 多线程/同步工具类.md

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
# **内容摘要**
1+
# 内容摘要
22

33
这里主要介绍了java5中线程锁技术以外的其他同步工具,首先介绍Semaphore:一个计数信号量。用于控制同时访问资源的线程个数,CyclicBarrier同步辅助类:从字面意思看是路障,这里用于线程之间的相互等待,到达某点后,继续向下执行。CountDownLatch同步辅助类:在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。犹如倒计时计数器,然后是Exchanger:实现两个对象之间数据交换,可阻塞队列:ArrayBlockingQueue,通过阻塞队列间的通信来演示其作用,最后介绍了几个同步集合。
44

5-
# **1. Semaphore实现信号灯**
5+
# 1. Semaphore实现信号灯
66

77
Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。Semaphore 只对可用许可的号码进行计数,并采取相应的行动。
88

@@ -508,6 +508,7 @@ public class ExchangerTest {
508508
}
509509
}
510510
```
511+
运行结果
511512
```
512513
线程pool-1-thread-1正在把: 毒品 交易出去
513514
线程pool-1-thread-2正在把: 美金 交易出去
@@ -530,6 +531,7 @@ ArrayBlockingQueue中只有put和take方法才具有阻塞功能。方法类型
530531
| 插入 | add(e) | offer(e) | put(e) | offer(e, time, unit) |
531532
| 移除 | remove() | poll() | take() | poll(time, unit) |
532533
| 检查 | element() | peek() | 不可用 | 不可用 |
534+
533535
示例:用3个空间的队列来演示向阻塞队列中存取数据的效果。
534536

535537
```java
@@ -697,16 +699,22 @@ public class BlockingQueueCommunication {
697699
}
698700
}
699701
```
700-
# **7. 同步集合类**
702+
# 7. 同步集合类
703+
704+
## Collections
705+
706+
- Collections.synchronizedList()
707+
- Collections.synchronizedSet()
708+
- Collections.synchronizedMap()
701709

702-
## 7.1 同步Map集合
710+
## 同步Map集合
703711

704-
- java.util.concurrent.ConcurrentMap
712+
- ConcurrentMap
705713
- ConcurrentHashMap
706714
- ConcurrentNavigableMap
707715
- ConcurrentSkipListMap
708716

709-
### **ConcurrentHashMap**
717+
### ConcurrentHashMap
710718

711719
使用锁分段技术
712720

@@ -806,16 +814,18 @@ ConcurrentNavigableMap 接口还有其他一些方法可供使用,比如:
806814

807815
关于这些方法更多信息参考官方 Java 文档。
808816

809-
## 7.2 同步List集合
817+
## 同步List集合
810818

811819
- ConcurrentSkipListSet
812820
- CopyOnWriteArraySet
813821
- CopyOnWriteArrayList
814822

815-
### **ConcurrentSkipListSet**
823+
### ConcurrentSkipListSet
824+
816825
一个基于 ConcurrentSkipListMap 的可缩放并发 NavigableSet 实现。类似于TreeSet,set 的元素可以根据它们的自然顺序进行排序,也可以根据创建 set 时所提供的Comparator 进行排序,具体取决于使用的构造方法。
817826

818-
### **CopyOnWriteArrayList**
827+
### CopyOnWriteArrayList
828+
819829
ArrayList 的一个线程安全的变体,可解决线程安全问题,在遍历的时候,同时进行添加操作。其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。
820830

821831
CopyOnWriteArrayList是一个线程安全、并且在读操作时无锁的ArrayList,其具体实现方法如下。
@@ -846,7 +856,8 @@ add方法并没有加上synchronized关键字,它通过使用ReentrantLock来
846856

847857
与ArrayList的性能对比,在读多写少的并发场景中,较之ArrayList是更好的选择,单线程以及多线程下增加元素及删除元素的性能不比ArrayList好
848858

849-
### **CopyOnWriteArraySet**
859+
### CopyOnWriteArraySet
860+
850861
对其所有操作使用内部 CopyOnWriteArrayList 的 Set。因此,它共享以下相同的基本属性:
851862

852863
- 它最适合于 set 大小通常保持很小、只读操作远多于可变操作以及需要在遍历期间防止线程间冲突的应用程序。
@@ -857,10 +868,10 @@ add方法并没有加上synchronized关键字,它通过使用ReentrantLock来
857868

858869
CopyOnWriteArraySet基于CopyOnWriteArrayList实现,其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent方法。保证了无重复元素,但在add时每次都要进行数组的遍历,因此性能会略低于上个。
859870

860-
## 7.3 ConcurrentLinkedQueue
871+
## ConcurrentLinkedQueue
861872

862873
ConcurrentLinkedQueue是一个基于链接节点的、无界的、线程安全的队列。此队列按照 FIFO(先进先出)原则对元素进行排序,队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列检索操作从队列头部获得元素。当许多线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择,此队列不允许 null 元素。
863874

864-
## 7.4 ConcurrentLinkedDeque
875+
## ConcurrentLinkedDeque
865876

866877
一个基于链接节点的、无界的、线程安全的双端队列

第6章 集合框架/Queue接口.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
- Queue接口
1010
- PriorityQueue 优先队列
11-
- ConcurrentLinkedQueue
11+
- ConcurrentLinkedQueue 支持并发访问的基于链表的队列
1212
- 插入
1313
- add()
1414
- offer()
@@ -26,6 +26,10 @@ BlockingQueue
2626
- ArrayBlockingQueue 顺序阻塞队列
2727
- LinkedBlockingQueue 链式阻塞队列
2828
- PriorityBlockingQueue 优先阻塞队列
29+
- SynchronousQueue 同步阻塞队列
30+
- DelayQueue
31+
- BlockingDeque 双端阻塞队列
32+
- LinkedBlockingDeque 基于链表的双端阻塞队列
2933

3034
### Deque 双端队列
3135

@@ -35,3 +39,19 @@ BlockingQueue
3539
- LinkedBlockingDeque
3640
- LinkedList
3741

42+
43+
| 方法说明 | 功能说明 |
44+
| ------------- | --------------------- |
45+
| addFirst() | 队首添加元素 |
46+
| addLast() | 队尾添加元素 |
47+
| offerFirst() | 队首添加元素 |
48+
| offerLast() | 队尾添加元素 |
49+
| removeFirst() | 删除队首元素 |
50+
| removeLast() | 删除队尾元素 |
51+
| pollFirst() | 返回并删除队首元素 |
52+
| pollLast() | 返回并删除队尾元素 |
53+
| getFirst() | 获取队首元素,如果队列为空,则抛异常 |
54+
| getLast() | 获取队尾元素,如果队列为空,则抛异常 |
55+
| peekFirst() | 获取队首元素,如果队列为空,则返回null |
56+
| peekLast() | 获取队尾元素,如果队列为空,则返回null |
57+
Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,20 @@
1-
线程安全的集合
1+
## 线程安全的集合
2+
3+
Collections
4+
5+
- synchronizedList()
6+
- synchronizedSet()
7+
- synchronizedMap()
8+
9+
支持高效并发访问的集合
10+
11+
- ConcurrentHashMap
12+
- ConcurrentSkipListMap
13+
- ConcurrentSkipListSet
14+
- ConcurrentLinkedQueue
15+
- ConcurrentLinkedDeque
16+
17+
采用复制底层数组的方式来实现写操作的集合
18+
19+
- CopyOnWriteArrayList
20+
- CopyOnWriteArraySet

0 commit comments

Comments
 (0)