1- # ** 内容摘要**
1+ # 内容摘要
22
33这里主要介绍了java5中线程锁技术以外的其他同步工具,首先介绍Semaphore:一个计数信号量。用于控制同时访问资源的线程个数,CyclicBarrier同步辅助类:从字面意思看是路障,这里用于线程之间的相互等待,到达某点后,继续向下执行。CountDownLatch同步辅助类:在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。犹如倒计时计数器,然后是Exchanger:实现两个对象之间数据交换,可阻塞队列:ArrayBlockingQueue,通过阻塞队列间的通信来演示其作用,最后介绍了几个同步集合。
44
5- # ** 1. Semaphore实现信号灯**
5+ # 1. Semaphore实现信号灯
66
77Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用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+
819829ArrayList 的一个线程安全的变体,可解决线程安全问题,在遍历的时候,同时进行添加操作。其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。
820830
821831CopyOnWriteArrayList是一个线程安全、并且在读操作时无锁的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
858869CopyOnWriteArraySet基于CopyOnWriteArrayList实现,其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent方法。保证了无重复元素,但在add时每次都要进行数组的遍历,因此性能会略低于上个。
859870
860- ## 7.3 ConcurrentLinkedQueue
871+ ## ConcurrentLinkedQueue
861872
862873ConcurrentLinkedQueue是一个基于链接节点的、无界的、线程安全的队列。此队列按照 FIFO(先进先出)原则对元素进行排序,队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列检索操作从队列头部获得元素。当许多线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择,此队列不允许 null 元素。
863874
864- ## 7.4 ConcurrentLinkedDeque
875+ ## ConcurrentLinkedDeque
865876
866877一个基于链接节点的、无界的、线程安全的双端队列
0 commit comments