前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并发容器类

并发容器类

作者头像
SuperHeroes
发布2018-05-31 14:08:00
4460
发布2018-05-31 14:08:00
举报
文章被收录于专栏:云霄雨霁云霄雨霁

并发容器类图

ConcurrentLinkedQueue

ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部,当我们获取一个元素时,它会返回队列头部的元素。该队列是非阻塞的,如果从一个空的ConcurrentLinkedQueue中获取值,会返回null。因此,ConcurrentLinkedQueue中元素不允许有空值。

Queue和BlockingQueue(阻塞队列)

Queue用来临时保存一组待处理的元素。它提供了几种实现,包括:ConcurrentLinkedQueue, 这是一个传统的先进先出队列;还有PriorityQueue,这是一个(非并发的)优先队列。Queue上的操作不会阻塞,如果队列为空,那么将会获取到空值。虽然可以用List模拟Queue的行为----事实上正是通过LinkedList来实现Queue的,但Queue能去掉List的随机访问请求,从而实现更高效的并发。

BlockingQueue扩展了Queue,增加了可阻塞的插入和获取操作。如果队列为空,那么获取元素的操作会阻塞知道队列中出现一个可用元素;如果队列已满,那么插入操作会阻塞知道队列出现可用空间。BlockngQueue是一个接口,Java提供了多种不同的实现类。

生产者-消费者模式

阻塞队列支持生产者-消费者模式。该模式将“找出需要完成的工作”和“执行工作”这两个过程分离开来,并把工作放入一个“待完成”的列表中以便在随后处理,而不是找出后立即处理。生产者-消费者模式简化了开发过程,因为它消除了生产者类和消费者类之间的代码依赖性。

双端队列--Deque和BlockingDeque

Deque和BlockingDeque分别扩展了Queue和BlockingQueue。Deque是一个双端队列,实现了在队列头和队列尾的高效插入和移除。具体实现包括ArrayDeque和ArrayBlockingDeque。

工作密取模式

正如阻塞队列适用于“生产者-消费者”模式,双端队列适用于另一种模式--“工作密取”。在生产者-消费者模式中,所有消费者共享一个工作队列,而在工作密取中,每个消费者都各自有自己的一个双端队列。如果一个消费者完成了自己双端队列中的全部工作,那么它可以从其他消费者的双端队列末尾秘密地获取工作。工作密取模式比一般的生产者-消费者模式具有更高的可伸缩性,这是因为工作线程不会在单个共享的任务队列发生竞争。

CopyOnWriteArrayList和CopyOnWriteArraySet

CopyOnWriteArrayList用于替代同步List,在某些情况下提供了更好的并发性能,并且在迭代期间不需要对容器进行加锁或复制(类似地,CopyOnWriteArraySet用来代替同步Set)。

CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

“写入时复制”容器的线程安全性在于:只要正确的发布一个事实不可变对象,那么在访问该对象时就不需要再进一步的同步。显然,每当修改时都会复制底层数组,这需要一定的开销,尤其是数组规模较大时。仅当迭代操作远远多于修改操作时,才应该使用“写入时复制”容器。

ConcurrentHashMap

与HashMap一样,ConcurrentHashMap也是一个基于散列的Map,但它使用了一种完全不同的加锁策略来提供更高的并发性和伸缩性。ConcurrentHashMap使用更细粒度的分段锁机制而不是将每一个方法都在同一个锁上同步。这种机制中,任意数量的读线程可以并发访问Map,执行读取的线程可以和执行写入的线程并发访问Map,并且一定数量的写入线程可以并发地修改Map。ConcurrentHashMap带来的结果是,在并发环境下将带来更高的吞吐量,在单线程环境中只损失非常小的性能。

ConcurrentHashMap与其他并发容器一起增强了同步容器类:他们提供的迭代器不会抛出ConcurrentModificationException,因此不需要在迭代的过程中加锁。返回的迭代器具有“弱一致性”,并非“即时失败”。

ConcurrentHashMap中没有实现对Map加锁已提供独占访问。在HashMap和synchronizedMap中获取Map的锁能防止其他线程访问这个Map。与HashMap和synchronizedMap相比,用ConcurrentHashMap来代替同步Map能进一步提高可伸缩性,只有在应用程序需要加锁Map以进行独占访问时,才应该放弃ConcurrentHashMap。

正如ConcurrentHashMap用于代替同步Map,Java6引入ConcurrentSkipListMapConcurrentSkipListSet来分别作为SortedMap和SortedSet的并发替代品。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.05.27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 并发容器类图
  • ConcurrentLinkedQueue
  • Queue和BlockingQueue(阻塞队列)
    • 生产者-消费者模式
    • 双端队列--Deque和BlockingDeque
      • 工作密取模式
      • CopyOnWriteArrayList和CopyOnWriteArraySet
      • ConcurrentHashMap
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档