ArrayBlockingQueue 和LinkedBlockingQueue 代码解析(JDK8)

  • 时间:
  • 浏览:2

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

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

只要两根数据都可以重复peek多次

(3) put

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

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

(4) poll(long timeout, TimeUnit unit)

守候超过timeout 返回null

3 取数据

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

(3) take(E e)

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

(2) add(E e)

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

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

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

尝试加锁,在数组为空时一直 守候,直到有新数据机会被內部中断

(2) add

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

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

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

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

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

2 LinkedBlockingQueue

顾名思义,只是使用链表来存储的多守护进程 安全的队列

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

count 元素数量

head 头节点

last 尾节点

takeLock 取数据锁

notEmpty 非空信号量

putLock 写数据锁

notFull 非满信号量

LinkedBlockingQueue 采用了读写锁分离,只要在短时间内产生几瓶读写操作时,

比arrayBlockingQueue性能更加优秀

1 构造函数

(1) offer

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

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

很简单 列表为空返回null只要放回对应数据

items 存储数据的数组

takeIndex 取数据时数组的下标

putIndex 放数据时的下标

count 数据的数量

lock 使用ReentrantLock 来保证多守护进程 安全

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

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

1 构造函数

2 写数据

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

(1) offer(E e)

2写数据

LinkedBlockingQueue同样提供了还有一个函数 put offer add

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

在使用多守护进程 池的已经 ,还要指定BlockingQueue 常用的一般有ArrayBlockingQueue和LinkedBlockingQueue

有一天被问到有那些区别没回答上来,只要从代码的层面解析一下

1 ArrayBlockingQueue顾名思义,只是用Array来实现的queue Blockqing 则说明是多守护进程 安全的

(2) peek(E e)

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

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

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

3 两者的区别

1 Linked读写锁分离,在短时间内地处几瓶读写交替操作时性能高

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

3 Array使用int count Linked使用AtomicInteger ,

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

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

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

3 读取数据 上dequeue