ArrayBlockingQueue 和LinkedBlockingQueue 代码解析(JDK8)

  • 时间:
  • 浏览:1
  • 来源:决战梭哈棋牌APP下载_决战梭哈棋牌APP官网

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

很简单 列表为空返回null却说我放回对应数据

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

ArrayBlockingQueue 还提供了四种 超时配置的妙招 ,在数组数据满超过timeout后返回fasle

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

也提供了等待的图片 超过timeout 返回null的poll妙招

(4) poll(long timeout, TimeUnit unit)

等待的图片 超过timeout 返回null

3 两者的区别

1 Linked读写锁分离,在短时间内所处极少量读写交替操作时性能高

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

3 Array使用int count Linked使用AtomicInteger ,

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

items 存储数据的数组

takeIndex 取数据时数组的下标

putIndex 放数据时的下标

count 数据的数量

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

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

notFull 非满信号量,在写数据时数据满时的等待的图片 信号量

1 构造函数

2 LinkedBlockingQueue

顾名思义,却说我使用链表来存储的守护进程运行安全的队列

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

和ArrayBlockingQueue一样,不可能 链表ch长度到达上限,就等待的图片 timeout ,超时后直接返回fasle

3 读取数据 上dequeue

(2) peek(E e)

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

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

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

却说我一根绳子 数据都也能 重复peek多次

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

(2) add

ArrayBlockingQueue 调用了父类AbstractQueue的add妙招 ,

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

AbstractQueue 的add妙招 调用了offer()妙招 ,所以add是offer的功能升级版

2写数据

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

同样提供了enqueue妙招 ,该妙招 仅在获取到putLock 后执行

(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 构造函数

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

尝试加锁,在数组为空时三个 劲等待的图片 ,直到有新数据不可能 被实物中断

在使用守护进程运行池的但是 ,必须指定BlockingQueue 常用的一般有ArrayBlockingQueue和LinkedBlockingQueue

有一天被问到有什么区别没回答上来,却说我从代码的层面解析一下

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

(1) offer

offer妙招 尝试插入数据,在数组满时返回false,正常插入 返回true

(3) put

put妙招 在进行数据插入时,会尝试获取锁并相应异常,同时,在数组满时,会一致等待的图片 ,直到数组有了空闲空间

3 取数据

和写数据一样,取数据jdk8也进行了一定优化 统一调用dequeue妙招

2 写数据

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

(1) offer(E e)

(3) take(E e)

链表到达最大长度。等待的图片 ,都也能 被异常中断