1
- # ** 内容摘要**
1
+ # 内容摘要
2
2
3
3
这里主要介绍了java5中线程锁技术以外的其他同步工具,首先介绍Semaphore:一个计数信号量。用于控制同时访问资源的线程个数,CyclicBarrier同步辅助类:从字面意思看是路障,这里用于线程之间的相互等待,到达某点后,继续向下执行。CountDownLatch同步辅助类:在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。犹如倒计时计数器,然后是Exchanger:实现两个对象之间数据交换,可阻塞队列:ArrayBlockingQueue,通过阻塞队列间的通信来演示其作用,最后介绍了几个同步集合。
4
4
5
- # ** 1. Semaphore实现信号灯**
5
+ # 1. Semaphore实现信号灯
6
6
7
7
Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。Semaphore 只对可用许可的号码进行计数,并采取相应的行动。
8
8
@@ -508,6 +508,7 @@ public class ExchangerTest {
508
508
}
509
509
}
510
510
```
511
+ 运行结果
511
512
```
512
513
线程pool-1-thread-1正在把: 毒品 交易出去
513
514
线程pool-1-thread-2正在把: 美金 交易出去
@@ -530,6 +531,7 @@ ArrayBlockingQueue中只有put和take方法才具有阻塞功能。方法类型
530
531
| 插入 | add(e) | offer(e) | put(e) | offer(e, time, unit) |
531
532
| 移除 | remove() | poll() | take() | poll(time, unit) |
532
533
| 检查 | element() | peek() | 不可用 | 不可用 |
534
+
533
535
示例:用3个空间的队列来演示向阻塞队列中存取数据的效果。
534
536
535
537
``` java
@@ -697,16 +699,22 @@ public class BlockingQueueCommunication {
697
699
}
698
700
}
699
701
```
700
- # ** 7. 同步集合类**
702
+ # 7. 同步集合类
703
+
704
+ ## Collections
705
+
706
+ - Collections.synchronizedList()
707
+ - Collections.synchronizedSet()
708
+ - Collections.synchronizedMap()
701
709
702
- ## 7.1 同步Map集合
710
+ ## 同步Map集合
703
711
704
- - java.util.concurrent. ConcurrentMap
712
+ - ConcurrentMap
705
713
- ConcurrentHashMap
706
714
- ConcurrentNavigableMap
707
715
- ConcurrentSkipListMap
708
716
709
- ### ** ConcurrentHashMap**
717
+ ### ConcurrentHashMap
710
718
711
719
使用锁分段技术
712
720
@@ -806,16 +814,18 @@ ConcurrentNavigableMap 接口还有其他一些方法可供使用,比如:
806
814
807
815
关于这些方法更多信息参考官方 Java 文档。
808
816
809
- ## 7.2 同步List集合
817
+ ## 同步List集合
810
818
811
819
- ConcurrentSkipListSet
812
820
- CopyOnWriteArraySet
813
821
- CopyOnWriteArrayList
814
822
815
- ### ** ConcurrentSkipListSet**
823
+ ### ConcurrentSkipListSet
824
+
816
825
一个基于 ConcurrentSkipListMap 的可缩放并发 NavigableSet 实现。类似于TreeSet,set 的元素可以根据它们的自然顺序进行排序,也可以根据创建 set 时所提供的Comparator 进行排序,具体取决于使用的构造方法。
817
826
818
- ### ** CopyOnWriteArrayList**
827
+ ### CopyOnWriteArrayList
828
+
819
829
ArrayList 的一个线程安全的变体,可解决线程安全问题,在遍历的时候,同时进行添加操作。其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。
820
830
821
831
CopyOnWriteArrayList是一个线程安全、并且在读操作时无锁的ArrayList,其具体实现方法如下。
@@ -846,7 +856,8 @@ add方法并没有加上synchronized关键字,它通过使用ReentrantLock来
846
856
847
857
与ArrayList的性能对比,在读多写少的并发场景中,较之ArrayList是更好的选择,单线程以及多线程下增加元素及删除元素的性能不比ArrayList好
848
858
849
- ### ** CopyOnWriteArraySet**
859
+ ### CopyOnWriteArraySet
860
+
850
861
对其所有操作使用内部 CopyOnWriteArrayList 的 Set。因此,它共享以下相同的基本属性:
851
862
852
863
- 它最适合于 set 大小通常保持很小、只读操作远多于可变操作以及需要在遍历期间防止线程间冲突的应用程序。
@@ -857,10 +868,10 @@ add方法并没有加上synchronized关键字,它通过使用ReentrantLock来
857
868
858
869
CopyOnWriteArraySet基于CopyOnWriteArrayList实现,其唯一的不同是在add时调用的是CopyOnWriteArrayList的addIfAbsent方法。保证了无重复元素,但在add时每次都要进行数组的遍历,因此性能会略低于上个。
859
870
860
- ## 7.3 ConcurrentLinkedQueue
871
+ ## ConcurrentLinkedQueue
861
872
862
873
ConcurrentLinkedQueue是一个基于链接节点的、无界的、线程安全的队列。此队列按照 FIFO(先进先出)原则对元素进行排序,队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列检索操作从队列头部获得元素。当许多线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择,此队列不允许 null 元素。
863
874
864
- ## 7.4 ConcurrentLinkedDeque
875
+ ## ConcurrentLinkedDeque
865
876
866
877
一个基于链接节点的、无界的、线程安全的双端队列
0 commit comments