ArrayBlockingQueue
有界阻塞队列,先进先出,存取互相排斥
数据结构:静态数组
容量固定必须指定长度,没有扩容机制
没有元素的位置也占用空间,被null占位
锁:ReentranLock
存取是同一把锁,操作的是同一个数组对象,存取互相排斥
阻塞对象
LinkedBlockingQueue
无界阻塞队列,可以指定容量,默认值为Integer.MAX_VALUE,先进先出,存取互不干扰
数据结构:链表
锁分离:存取互不干扰,存取操作的是不同的Node对象
takeLock 取Node节点保证前驱后继不会乱
putLock 存Node节点保证前驱后继不会乱
阻塞对象
notEmpty
出队:队列count=0,无元素可取时,阻塞在该对象上
notFull
入队:队列count=capacity,放不进去元素时,阻塞在该对象上
先进先出
线程池中为什么用LinkedBlockingQueue而不使用ArrayBlockingQueue?
锁分离
LinkedBlockingDeque
一个链表阻塞双端队列,无界可以指定容量,默认为Integer.MAX_VALUE
数据结构:链表(同LinkedBlockingQueue)
内部类Node存储元素
锁:ReentrantLock(同ArrayBlockingQueue)
存取是同一把锁
阻塞对象(同LinkedBlockingQueue)
notEmpty
无元素可取时,阻塞在该对象上(count==0)
notFull
放不进去时,阻塞在该对象上(count==capacity)
出队
入队
应用场景
常用于“”工作窃取“”算法,ForkJoinPooli使用的就是这种算法