队列
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