java中的并发集合类概述

时间:2022-06-06 18:20:10
一,普通集合类中线程安全的集合:Vector  && Stack
1,Vector:
(1)默认分配初始大小为10的数组,在构造方法中可以指定数组初始大小和增长大小。
(2)线程安全主要是通过在方法中加synchronize关键字来实现,因此,相比于其他线程安全集合类,效率相对低吧。因为锁定的是方法。
(3)查看源码会发现大量使用System.arraycopy()方法。所以,集合保证插入顺序,但若指定位置无序插入或删除,会导致arraycopy()操作,
   对于大量数据来说效率相对较低。
(4)提供的set(int index,Object value)方法有返回值,返回的是oldValue。get()也有synchronize关键字
(5)可返回迭代器。
所以,从以上特性可看出,Vector适合用于一次赋值多次读出或数据量不大的多线程环境中。
2,Stack:实现先进后出的数组。是Vector的扩展。是不过增加了5个关于栈操作的方法:peek(),pop(),push(),emnpty(),search().官方推荐使用
         实现了Deque接口是类。 Deque<Integer> stack = new ArrayDeque<Integer>();是指双端队列,但这个ArrayDeque是线程不安全,不限
         大小的,具体接口使用时再看。
二,Concurrent包中提供的线程安全集合()
1,ConcurrentHashMap.其主要接口方法和HashMap是差不多的。但是,ConcurrentHashMap是使用了ReentranLock(可重入锁机制)来保证在多线程
  环境下是线程安全的。
2,ConcurrentLinkedDeque:线程安全的双端队列,当然也可以当栈使用。由于是linked的,所以大小不受限制的。具体API就不多说了。
3,ConcurrentLinkedQueue:线程安全的队列。
4,ConcurrentSkipListMap:基于跳表实现的线程安全的MAP。除了线程安全的特性外,该map还接受比较器进行排序的map,算法复杂度还是log(n)级别的。
。API中提供了一些以前不常使用的方法。以后再具体研究这个跳表的问题。
5,ConcurrentSkipSet:基于4实现的set。
6,CopyOnWriteArrayList:以资源换取并发。通过迭代器快照的方式保证线程并发的访问。
7,CopyOnWriteArraySet:基于6实现的。
三,具体看下ReentranLock(可重入锁机制):有点复杂,以后总结。
四,下午仔细看了下ConCurrentHashMap多线程并发下实现的原理,就整个过程来说,实现还是比较复杂的,不仅仅是加锁的问题,同时还应用了java
    内存模型中的可见性原理来保证进行进行写操作时其他进程对该进程进行读写的可见性。通过在hashEntry中使用final来保证所有数据的插入都会在
    当前读进程之前的,从而达到读进程和写进程并发。为了减小加锁粒度,实现部分写进程的并发,引进了Segment类,让锁加在Segment段中,从而
    达到更多的并发,也就是传说中的分离锁。
最后,其实在使用锁机制来协调多线程并发访问时,减少对锁的竞争可以有效地增加并发量,而减少对锁的竞争最常用的方式,一个是减少请求同一个锁的
概率,实现锁分离。二是减少占用锁的时间,让锁的粒度达到最小。


时间关系,这个文档就到这里。后续有时间会继续整理下ConcurrentHashMap和ReentranLock相关机制,这对于理解多线程并发来说,无疑是友谊的。