数据结构
队列
先进先出(FIFO)的抽象数据结构,队尾(rear),队头(font)
- add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
- element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
- offer 添加一个元素并返回true 如果队列已满,则返回false
- poll 移除并返问队列头部的元素 如果队列为空,则返回null
- peek 返回队列头部的元素 如果队列为空,则返回null
- put 添加一个元素 如果队列满,则阻塞
- take 移除并返回队列头部的元素 如果队列为空,则阻塞
put或者take 导致线程阻塞
数组 链表 循环 head tail = (tail + 1) % size;
非阻塞队列
LinkedList:双向链
ConcurrentLinkedQueue:基于链接节点的线程安全队列
PriorityQueue:维护了一个有序列表
阻塞队列 实现BlockingQueue接口
ArrayBlockingQueue:数组实现的有界阻塞队列,试图将一个元素放入一个已满的队列将导致操作阻塞;试图从空队列中取出一个元素也会阻塞。
LinkedBlockingQueue:基于链表实现的可选边界的阻塞队列
DelayQueue:延时队列,网上说可以做订单的一些提醒操作之类的
PriorityBlockingQueue:无界阻塞队列
SynchronousQueue:突然看到一个AQS然而并不懂,说SynchronousQueue是直接使用CAS实现线程的安全访问。
- AQS就是基于CLH队列,用volatile修饰共享变量state,线程通过CAS去改变状态符,成功则获取锁成功,失败则进入等待队列,等待被唤醒。
https://blog.csdn.net/mulinsen77/article/details/84583716
- CAS 比较和替换是设计并发算法时用到的一种技术
https://blog.csdn.net/ls5718/article/details/52563959