java.util.concurrent(一) 并发集合类

1、LinkedBlockingQueue

           阻塞队列、线程安全,可在构造方法参数中指定容量、默认容量为Integer.MAX_VALUE,实现了BlockingQueue接口以及Collection和Iterator接口的所有方法,不接受null元素。常用方法有put和take,put方法在队列满的时候会阻塞直到有成员被消费,take方法在队列空的时候会阻塞,直到有成员被放进来。

 

2、ConCurrentLinkedQueue

          非阻塞队列、线程安全,无界队列,不接受null元素,采用CAS操作保证元素一致性,实现基于有效的“无等待(wait-free)”算法。与大多数collection不同,size()方法不是固定时间操作,由于该队列异步特性、确定元素数量需要遍历这些元素。

 

3、CopyOnWriteArrayList

          使用读写分离技术。适用于读操作远远大于写操作的场景、比如缓存。

          CopyOnWriteArrayList里的写操作是先将原始数据通过Arrays.Copyof()来生成一份新的数组、然后在新的数组上进行写,写完后将原来的引用指向到当前这个数组对象,这样保证了每次写都在新对象上(保证写的一致性,对各种写操作需加锁)、读则在当前对象上进行读,不存在加锁和阻塞。

 

4、ConcurrentHashMap

          HashMap线程不安全,HashTable采用Synchronized保证线程安全,但是在线程激烈的情况下效率非常低,因为竞争的是同一把锁。

          concurrentHashMap采用了锁分段技术。该集合的get操作非常高效,该操作并未加锁,除非读到空值才会加锁重读。ConcurrentHashMap将HashEntry的共享变量value定义为Volatile类型,该变量的读操作happen-before与对其的写操作,因此可以不用加锁直接读取。put操作需要加锁,第一步判断是否需要扩容,后进行put操作;因为采用了锁分段技术、对各个段的put操作竞争不同的锁,可以高效的进行操作。

你可能感兴趣的:(Concurrent)