文档章节

ConcurrentLinkedQueue使用实例

go4it
 go4it
发布于 2017/09/09 23:03
字数 391
阅读 14
收藏 0

ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部,当我们获取一个元素时,它会返回队列头部的元素。

对比

| queue | 阻塞与否 | 是否有界 | 线程安全保障 | 适用场景 | 注意事项 |

|-------|---------|---------| -----------| --------| --------|

|ArrayBlockingQueue | 阻塞 | 有界| 一把全局锁 | 生产消费模型,平衡两边处理速度 | -- |

|LinkedBlockingQueue | 阻塞 | 可配置 | 存取采用2把锁 | 生产消费模型,平衡两边处理速度 | 无界的时候注意内存溢出问题 |

|ConcurrentLinkedQueue | 非阻塞 | 无界 | CAS | 对全局的集合进行操作的场景 | size() 是要遍历一遍集合,慎用 |

实例

由于ConcurrentLinkedQueue是无界的,所以使用的时候要特别注意内存溢出问题。akka的actor模型,默认的mailbox是用这个来实现的。

object UnboundedMailbox {
  class MessageQueue extends ConcurrentLinkedQueue[Envelope] with UnboundedQueueBasedMessageQueue {
    final def queue: Queue[Envelope] = this
  }
}

MyUnboundedMailbox

public class MyUnboundedMailbox implements MailboxType,
  ProducesMessageQueue<MyUnboundedMailbox.MyMessageQueue> {

  // This is the MessageQueue implementation
  public static class MyMessageQueue implements MessageQueue,
      MyUnboundedMessageQueueSemantics {
    private final Queue<Envelope> queue =
      new ConcurrentLinkedQueue<Envelope>();

    // these must be implemented; queue used as example
    public void enqueue(ActorRef receiver, Envelope handle) {
      queue.offer(handle);
    }
    public Envelope dequeue() { return queue.poll(); }
    public int numberOfMessages() { return queue.size(); }
    public boolean hasMessages() { return !queue.isEmpty(); }
    public void cleanUp(ActorRef owner, MessageQueue deadLetters) {
      for (Envelope handle: queue) {
        deadLetters.enqueue(owner, handle);
      }
    }
  }

  // This constructor signature must exist, it will be called by Akka
  public MyUnboundedMailbox(ActorSystem.Settings settings, Config config) {
    // put your initialization code here
  }

  // The create method is called to create the MessageQueue
  public MessageQueue create(Option<ActorRef> owner, Option<ActorSystem> system) {
    return new MyMessageQueue();
  }
}

doc

© 著作权归作者所有

共有 人打赏支持
go4it
粉丝 70
博文 816
码字总数 684755
作品 0
深圳
私信 提问
Java并发编程原理与实战三十五:并发容器ConcurrentLinkedQueue原理与使用

一、简介 一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。 新的元素插入到...

pony1223
08/21
0
0
Java中的队列都有哪些,有什么区别。

Java中的队列都有哪些,实际上是问queue的实现有哪些,如:ConcurrentLinkedQueue、LinkedBlockingQueue 、ArrayBlockingQueue、LinkedList。 源于我经历过的一次生产事故,有个服务会收集业...

郑加威
02/27
1
0
Java集合--非阻塞队列(ConcurrentLinkedQueue)

1.0 非阻塞队列 在上篇中,我们讲到了阻塞队列,以及阻塞队列中的几个实现类。 本篇,我们继续对队列进行研究。而今天的主题,则是非阻塞队列!在非阻塞队列中,ConcurrentLinkedQueue是主要...

贾博岩
2017/12/27
0
0
【实战Java高并发程序设计 1】Java中的指针:Unsafe类

是《实战Java高并发程序设计》第4章的几点。 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现。现在,就让我们更进一步看一下它把! publ...

吴小编
2015/11/25
228
0
ConcurrentLinkedQueue源码分析

相关文章 Lock锁源码分析 java阻塞队列BlockingQueue HashMap源码分析-jdk1.6和jdk1.8的区别 LinkedList源码分析 ArrayList源码分析 前言 ConcurrentLinkedQueue是一个线程安全的队列,它采用...

tsmyk0715
07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
2
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
4
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部