ArrayBlockingQueue 和LinkedBlockingQueue 代码解析(JDK8)

  • 时间:
  • 浏览:1

(4) poll(long timeout, TimeUnit unit)(E e, long timeout, TimeUnit unit)

也提供了守候超过timeout 返回null的poll最好的办法

(2) add(E e)

和ArrayBlockingQueue一样,直接调用offer最好的办法 ,在新增成功后返回true,在新增失败后直接抛出异常

(3) put(E e) put操作 和offer操作基本一致,只不过在链表满时进行守候,知道链表节点减少

capacity 链表的最大长度,默认为Integer.MAX_VALUE

count 元素数量

head 头节点

last 尾节点

takeLock 取数据锁

notEmpty 非空信号量

putLock 写数据锁

notFull 非满信号量

LinkedBlockingQueue 采用了读写锁分离,之后在短时间内产生絮状读写操作时,

比arrayBlockingQueue性能更加优秀

1 构造函数

(4) offer(E e, long timeout, TimeUnit unit)

ArrayBlockingQueue 还提供了并不是超时配置的最好的办法 ,在数组数据满超过timeout后返回fasle

(4) offer(E e, long timeout, TimeUnit unit)

和ArrayBlockingQueue一样,不可能 链表ch长度到达上限,就守候timeout ,超时后直接返回fasle

3 读取数据 上dequeue

(1) offer

offer最好的办法 尝试插入数据,在数组满时返回false,正常插入 返回true

(1) poll(E e, long timeout, TimeUnit unit)

(3) put

put最好的办法 在进行数据插入时,会尝试获取锁并相应异常,并肩,在数组满时,会一致守候,直到数组有了空闲空间

(1) offer(E e)

(3) take(E e)

链表到达最大长度。守候,可不可不可以 被异常中断

(2) take(E e, long timeout, TimeUnit unit)

尝试加锁,在数组为空时老要守候,直到有新数据不可能 被内外部中断

2写数据

LinkedBlockingQueue同样提供了有两个多多多 多函数 put offer add

同样提供了enqueue最好的办法 ,该最好的办法 仅在获取到putLock 后执行

(1) poll(E e, long timeout, TimeUnit unit)

很简单 列表为空返回null之后放回对应数据

items 存储数据的数组

takeIndex 取数据时数组的下标

putIndex 放数据时的下标

count 数据的数量

lock 使用ReentrantLock 来保证线程池池安全

notEmpty 非空信号量,用来进行取数据时的信号量

notFull 非满信号量,在写数据时数据满时的守候信号量

1 构造函数

(2) add

ArrayBlockingQueue 调用了父类AbstractQueue的add最好的办法 ,

在插入成功时返回true,在插入失败(数组满)时,抛出异常

AbstractQueue 的add最好的办法 调用了offer()最好的办法 ,很多add是offer的功能升级版

2 LinkedBlockingQueue

顾名思义,之后使用链表来存储的线程池池安全的队列

3 两者的区别

1 Linked读写锁分离,在短时间内占据 絮状读写交替操作时性能高

2 Array在读写操作时不还要维护额外节点,空间较少

3 Array使用int count Linked使用AtomicInteger ,

之后:Array使用唯一Lock来保证count强一致性,Linked使用Atomic来保证count的准确性

在使用线程池池池的之后,还要指定BlockingQueue 常用的一般有ArrayBlockingQueue和LinkedBlockingQueue

有一天被问到有哪几个区别没回答上来,之后从代码的层面解析一下

1 ArrayBlockingQueue顾名思义,之后用Array来实现的queue Blockqing 则说明是线程池池安全的

3 取数据

和写数据一样,取数据jdk8也进行了一定优化 统一调用dequeue最好的办法

(2) peek(E e)

占据 返回数据,不占据 返回null,链表节点不便,仅获取数据

(4) poll(long timeout, TimeUnit unit)

守候超过timeout 返回null

2 写数据

研究代码发现 put add offer有两个多多多 多最好的办法 都调用了enqueue最好的办法 ,ArrayBlockingQueue 将对数组的实际操作在jdk8抽象了出来,相对于jdk7进行了一定优化

(3) peek(E e, long timeout, TimeUnit unit)

返回最老数据,之后不弹出数据,仅获取数据。在数组为空时返回null

之后每根数据可不可不可以 重复peek多次