Java 并发集合

队列

BlockingQueue

BlockingQueue即阻塞队列

实现方法

  • add(E): boolean

    插入数据满了抛出IllegalStateException

  • offer(E): boolean

    插入数据, 不抛出异常(如果满了),返回boolean

  • offer(E, long, TimeUnit):boolean

  • put(E):void

    堵塞插入数据

  • take():E

    取出并删除头部数据, 阻塞直到获取

  • poll(long, TimeUnit):E

    取出并删除头部数据, 可设置可用的时间

  • remove(Object): boolean

    删除一个实例

  • contains(Object): boolean

    实例是否在队列

  • remainingCapacity(): int

    剩余插入数量

  • drainTo(Collection): int

    移除队列, 加入到collection集合中

  • drainTo(Collection, int): int

    移除队列, 加入到collection集合中, 设置最大值

实现类

ArrayBlockingQueue

组实现的有界阻塞队列。该队列命令元素FIFO(先进先出)

队列中的锁是没有分离的,即生产和消费用的是同一个锁

相对于Linked内存开销较小(无须动态申请存储空间)

LinkedBlockingQueue

基于链表的阻塞队列

队列中的锁是分离的(采用两把锁),即生产用的是putLock,消费是takeLock

队列中可以不指定队列的大小,但是默认是Integer.MAX_VALUE, 可能会内存溢出

DelayQueue

一个无边界的存放<.Delayed>元素的支持延迟获取元素的阻塞队列

内部使用<.PriorityQueue>存储元素, 元素必须实现<.Delayed> 接口

创建元素时可以指定多久才可以从队列中获取当前元素,只有在延迟期满时才能从队列中提取元素

PriorityBlockingQueue

一个无边界可以使用排序规则(权重)的阻塞队列。

每个元素要实现compareTo方法因此不支持null

会根据优先级将优先级最小的最先取出

SynchronousQueue

不会为队列中元素维护存储空间

它维护一组线程,这些线程在等待着把元素加入或移出队列。

使用场景:

Executors.newCachedThreadPool()

##BlockingDeque

继承BlockingQueue

LinkedBlockingDeque

基于链表的双端阻塞队列

TransferQueue

继承BlockingQueue

生产者会一直阻塞直到所添加到队列的元素被某一个消费者所消费(不仅仅是添加到队列里就完事)

消费者的消费能力将决定生产者产生消息的速度

实现方法:

  • transfer(E): void

    当前存在一个正在等待获取的消费者线程

    否则将元素e插入到队列尾部,并且当前线程进入阻塞状态,直到有消费者线程取走该元素

  • tryTransfer(E): boolean

    不进行堵塞, 返回boolean状态

  • tryTransfer(E, long, TimeUnit):boolean

    堵塞超时,返回boolean状态

  • hasWaitingConsmer():boolean

  • getWaitingCOnsumerCount():int

ConcurrentMap

提供线程安全和原子性保证的map

ConcurrentHashMap

与HashMap不同的是,ConcurrentHashMap中多了一层数组结构,由Segment和HashEntry两个数组组成。其中Segment起到了加锁同步的作用,而HashEntry则起到了存储K.V键值对的作用。

在多线程中,每一个Segment对象守护了一个HashEntry数组,当对ConcurrentHashMap中的元素修改时,在获取到对应的Segment数组角标后,都会对此Segment对象加锁,之后再去操作后面的HashEntry元素,这样每一个Segment对象下,都形成了一个小小的HashMap,在保证数据安全性的同时,又提高了同步的效率。只要不是操作同一个Segment对象的话,就不会出现线程等待的问题!

ConcurrentNavigableMap

继承ConcurrentMap

多线程

Atomic 原子

AtomicBoolean

AtomicInteger

AtomicIntegerArray

AtomicIntegerFieldUpdater

Long…

AtomicMarkableReference

AtomicReference

AtomicReferenceArray

AtomicReferenceFieldUpdater

AtomicStampedReference

DoubleAccumulator

DoubleAdder

LongAccumulator

LongAdder

Striped64

Locks 锁

Locks

ReentrantLock

Condition

ReadWriteLock

ReentrantReadWriteLock

LockSupport

StampedLock

 上一篇

jdk8