前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ConcurrentLinkedQueue使用实例

ConcurrentLinkedQueue使用实例

作者头像
code4it
发布2018-09-17 15:00:57
1.4K0
发布2018-09-17 15:00:57
举报
文章被收录于专栏:码匠的流水账

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

对比

queue

阻塞与否

是否有界

线程安全保障

适用场景

注意事项

ArrayBlockingQueue

阻塞

有界

一把全局锁

生产消费模型,平衡两边处理速度

LinkedBlockingQueue

阻塞

可配置

存取采用2把锁

生产消费模型,平衡两边处理速度

无界的时候注意内存溢出问题

ConcurrentLinkedQueue

非阻塞

无界

CAS

对全局的集合进行操作的场景

size() 是要遍历一遍集合,慎用

实例

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

代码语言:javascript
复制
object UnboundedMailbox {
  class MessageQueue extends ConcurrentLinkedQueue[Envelope] with UnboundedQueueBasedMessageQueue {
    final def queue: Queue[Envelope] = this
  }
}

MyUnboundedMailbox

代码语言:javascript
复制
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

  • Actors and Green Threads in Java Demystified
  • Mailboxes
  • Mailbox.scala
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 对比
  • 实例
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档