Files
Hui-s-notebook/Java 并发包中并发队列原理剖析.md
2023-09-10 10:50:53 +08:00

1.7 KiB
Raw Blame History

ConfurrentLinkedQueue

线程安全的无界非阻塞队列,底层使用单向链表实现,入队和出队使用 CAS 实现线程安全

  1. offer 操作,在队列末尾添加一个元素
  2. add 操作,在链表末尾添加一个元素,内部调用的是 offer
  3. poll 操作,在队列头部获取并移除一个元素,为空返回 null
  4. peek 操作,获取头部元素,只获取不移除
  5. size 操作,计算当前元素个数,并发下不精确
  6. remove 操作,队列里存在就删除,存在多个删除第一个
  7. contains 操作,判断队列里是否含有指定对象

LinkedBlockingQueue

使用独占锁实现,有界链表的阻塞队列

  1. offer
  2. put向队列尾部插入一个元素
  3. poll
  4. peek
  5. take获取当前头部元素并从队列里移除
  6. remove
  7. size

ArrayBlockingQueue

使用有界数组实现的阻塞队列,构造函数必须传入队列大小

  1. offer
  2. put
  3. poll
  4. take
  5. peek
  6. size

PriorityBlockingQueue

带优先级的无界阻塞队列,每次出队返回优先级最高或最低的元素,内部使用平衡二叉树堆实现,直接遍历不保证有序性

  1. offer
  2. poll获取队列内部堆树的根节点元素
  3. put
  4. take获取队列内部堆树的根节点元素
  5. size返回前加锁保证不会有其他入队出队操作

DelayQueue

无界阻塞延迟队列,每个元素都有过期时间,获取元素时只有过期元素会出队列,队列头元素时最快要过期的元素

  1. offer
  2. take获取并移除队列里延迟时间过期的元素没有则等待
  3. poll获取并移除队列头过期元素没有返回 null
  4. size计算过期和没过期的元素个数