JAVA queue

Queue基本功能 FIFO
add对应remove,element, 在队列尾部新增元素,队列头部取出、查看元素,失败时抛出异常
offer对应poll,peek 失败时返回null,

ArrayQueue
非线程安全
有容量大小,基于数组.数组长度为容量+1,tail指针的位置不存储元素。
不会扩容
原理:通过向右移动head和tail索引来新增删除数据。初始化都为0。 无论移动head还是tail,都是使用加一模长度而得。通过加一模长度的方式来移动下标。判断满:(tail + 1)%length = head。 判断空: tail = head

ConcurrentLinkedQueue
线程安全
基于链表,无容量
原理:入队和出队采用CAS的方式

LinkedBlockingQueue
线程安全:采用put锁和take锁保证安全
可以指定容量大小也可以不指定
不会扩容
原理:有一个put锁和take锁,当put时获取put锁,当满了的时候,则使用put锁的condition进行await操作。如果操作完成之后,当前容量小于总容量,需要执行该condition的的signal操作,然后释放锁。
释放锁后,如果在put之前的容量为空时,说明之前可能有take线程在阻塞,这时候获取take锁,然后用take锁的condition来执行signal操作。 take原理和put类似。

ArrayBlockingQueue
线程安全:采用了一个锁来保证线程安全
需要指定容量,容器的容量等于数组的长度
不会扩容
原理:有一个全局锁,在put和take时都要上锁。一个锁有两个condition对象,分别用于唤醒指定的线程。有一个count记录元素的数量。
由于是同一个锁,所以count不需要是AtomicInteger。有一个putIndex和takeIndex。通过count来判断队列是否满的。这里不像ArrayQueue用下标来判断元素个数和是否满。索引加1后如果等于数组长度则设置为0。

PriorityQueue
非线程安全,
有初始容量大小,无界,基于一个数组进行堆排序。
会扩容:底层数组容量小于64时乘以2,否则新增百分之50
原理:基于堆排序保证poll和遍历的顺序,每次add后依然有序,是不稳定的排序。使用Comparator对象来设置元素的大小。Comparator有两个参数,返回小于0代表按从小到大顺序,否则逆序。

PriorityBlockingQueue
线程安全: 线程安全,所有的public操作都有一个锁
有初始容量大小,无界,基于一个数组进行堆排序。会扩容
原理:由于是无界的,所以只会阻塞take操作不会阻塞put操作。

DelayQueue
线程安全:安全,采用了一个锁来保障
容量:无容量
不会扩容:基于PriorityQueue实现
原理:基于PriorityQueue,放入其中的元素需要实现Delayed接口,改接口有两个方法:public long getDelay(TimeUnit unit) 和public int compareTo(Delayed o)。
getDelay方法用于返回当前元素剩余需要等待的时间,compareTo用于决定插入的元素在队列中的顺序。参数o代表拿当前对象和对象o进行比较,直接写return this.getDelay(TimeUnit.MICROSECONDS) - o.getDelay(TimeUnit.MICROSECONDS)即可,按顺序排。

SynchronousQueue
插入操作必须等待到另一个取数据操作同时进行,相当于做数据交换。它本身并不存储任何数据。可以用户线程之间交互,只有等待一个线程把任务取走或插入,另外一个线程才能插入信息或取出信息继续执行。

ArraryList扩容
首先有一个期望长度,当前数据长度增长百分之五十后如果小于期望长度,则设置为期望长度,否则增长百分之50

ArrayDeque 双倍扩容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值