java-3.6 juc-collection

180 阅读2分钟

Collection

减少锁的粒度

它的思想是将物理上的一个锁,拆成逻辑上的多个锁,增加并行度,从而降低锁竞争。它的思想也是用空间来换时间; 拆锁的粒度不能无限拆,最多可以将一个锁拆为当前cup数量个锁即可

ConcurrentHashMap

java中的ConcurrentHashMap在jdk1.8之前的版本,使用一个Segment 数组 Segment< K,V >[] segments Segment继承自ReenTrantLock,所以每个Segment就是个可重入锁,每个Segment 有一个HashEntry< K,V >数组用来存放数据,put操作时,先确定往哪个Segment放数据,只需要锁定这个Segment,执行put,其它的Segment不会被锁定;所以数组中有多少个Segment就允许同一时刻多少个线程存放数据,这样增加了并发能力。

LinkedBlockingQueue

LinkedBlockingQueue也体现了这样的思想,在队列头入队,在队列尾出队,入队和出队使用不同的锁,相对于LinkedBlockingArray只有一个锁效率要高;

读写分离

CopyOnWriteArrayList 、CopyOnWriteArraySet

CopyOnWrite容器即写时复制的容器。 通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。 这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。 CopyOnWrite并发容器用于读多写少的并发场景,因为,读的时候没有锁,但是对其进行更改的时候是会加锁的,否则会导致多个线程同时复制出多个副本,各自修改各自的;

ConcurrentLinkedQueue

BlockingQueue

image.png

image.png

  • 数组阻塞队列 ArrayBlockingQueue
  • 链阻塞队列 LinkedBlockingQueue
  • 具有优先级的阻塞队列 PriorityBlockingQueue
  • 同步队列 SynchronousQueue
  • 延迟队列 DelayQueue
  • 链阻塞双端队列 LinkedBlockingDeque

ConcurrentSkipListMap

代替 treeMap

ConcurrentSkipListSet

代替 treeSet