Disruptor中锁对性能有什么影响

技术Disruptor中锁对性能有什么影响本篇文章给大家分享的是有关Disruptor中锁对性能有什么影响,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Di

本文讲述的是中断器中的锁如何影响性能。边肖觉得很实用,所以想分享给大家学习。希望大家看完这篇文章能有所收获。我不多说。让我们和边肖一起看看。

颠覆者是英国外汇交易公司LMAX开发的高性能队列。研发的初衷是为了解决内存队列的延迟问题(在性能测试中发现与I/O操作处于同一数量级)。基于Disruptor开发的系统,单线程每秒可支持600万订单,2010年在QCon演讲后获得业界关注。2011年,企业应用软件专家马丁福勒写了一篇很长的介绍。同年,还获得甲骨文官方杜克奖。

目前,包括Apache Storm、Camel、Log4j 2在内的很多知名项目都应用了Disruptor来获得高性能。它在美团的技术团队中也有很多应用,一些项目架构借鉴了它的设计机制。本文从实战角度分析了干扰机的实现原理。

特别是这里提到的队列是系统的内存队列,而不是像卡夫卡那样的分布式队列。此外,本文中描述的中断器或功能仅限于3.3.4。

在介绍Disruptor之前,我们先来看看常用的线程安全内置队列有什么问题。下表显示了Java的内置队列。

队列有界锁数据结构数组锁队列有界锁数组锁队列可选-有界锁链接列表并发链接队列无界无锁链接列表链接传输。queue无界解锁的linked list priorityblockingqueueunbounded锁定的heapdelayqueue无界锁定的堆队列一般分为三种类型:数组、链表和堆。其中,堆一般用于实现具有优先级特征的队列,暂不考虑。

从数组和链表两种数据结构来看,ArrayBlockingQueue是一种典型的基于数组线程安全的队列,主要通过锁来保证线程安全。基于链表的线程安全队列可以分为两类:LinkedBlockingQueue和ConcurrentLinkedQueue。前者也是通过锁定实现线程安全,而后者和上表中的LinkedTransferQueue是通过原子变量比较和交换(以下简称“CAS”)实现的,没有锁定。

无锁实现的队列是无界的(不能保证队列长度在一定范围内);锁定的方式可以实现有界队列。在稳定性要求极高的系统中,为了防止生产者运行过快,造成内存溢出,只能选择有界队列。同时,为了减少Java垃圾收集对系统性能的影响,将尽可能选择数组/堆格式的数据结构。这样,只有ArrayBlockingQueue是合格的。

在实际使用中,由于锁定和伪共享,ArrayBlockingQueue会有严重的性能问题。下面我们来分析一下。

00-1010在实际编程过程中,锁定通常会严重影响性能。线程将被挂起,因为它们不能竞争锁,当锁被释放时,它们将被恢复。在这个过程中,有很多开销,通常会有很长的中断,因为当一个线程在等待锁时,它不能做其他任何事情。如果线程在持有锁时被延迟,例如页面错误、调度延迟或其他类似情况,则所有需要该锁的线程都无法执行。如果被阻塞线程的优先级较高,而持有锁的线程的优先级较低,则会发生优先级反转。

颠覆者的论文讲述了一个实验:

这个测试程序调用一个函数,该函数自动将64位计数器递增5亿次。

机器环境:2.4G 6核。

操作:64位计数器累计5亿次。

方法时间(毫秒)单线程300个带cas的单线程5,700个带锁的单线程10,000个带volatile write的单线程4,700个带cas的双线程30,000个带锁的双线程224,000个cas操作比不带锁的单线程慢一个数量级。当有锁且多线程并发时,速度比没有锁的单线程慢3个数量级。可见,无锁速度是最快的。

单线程条件下,解锁CAS操作的性能就是锁定CAS操作的性能。

在多线程的情况下,为了保证线程安全,必须使用CAS或lock。在这种情况下,CAS的性能超过了lock,前者是后者的8倍左右。

以上是中断器中锁对性能的影响。边肖认为,一些知识点可能会在我们的日常工作中看到或使用。我希望你能通过这篇文章学到更多的知识。更多详情请关注行业资讯频道。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/39234.html

(0)

相关推荐

  • 犬字旁的字有哪些字,带"犭"偏旁的字大多与什么有关

    技术犬字旁的字有哪些字,带"犭"偏旁的字大多与什么有关带“犭”偏旁的字大多与动物有关犬字旁的字有哪些字,如:猫、狗、猪。一、猫:māo máo 1.释义:[ māo ] (1)哺乳动物,面呈圆形,脚有利爪,行动敏捷

    生活 2021年10月21日
  • spring-data-jpa中findOne与getOne的区别是什么

    技术spring-data-jpa中findOne与getOne的区别是什么本篇内容主要讲解“spring-data-jpa中findOne与getOne的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷

    攻略 2021年11月23日
  • 85的因数有哪些,85和100的最大公因数是什么

    技术85的因数有哪些,85和100的最大公因数是什么85和100的最大公因数是585的因数有哪些。85=517。
    100=5x5x4。
    拓展资料最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个

    生活 2021年10月24日
  • css中position属性设置(css中position的属性)

    技术css定位position属性怎么使用这篇文章主要介绍“css定位position属性怎么使用”,在日常操作中,相信很多人在css定位position属性怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操

    攻略 2021年12月20日
  • postgresql中用户安全配置的示例分析

    技术postgresql中用户安全配置的示例分析小编给大家分享一下postgresql中用户安全配置的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起

    攻略 2021年11月18日
  • dy刷粉网站推广马上刷,有没有抖音刷点赞双击的神器?

    技术dy刷粉网站推广马上刷,有没有抖音刷点赞双击的神器?我们刷抖音的时候都会发现我们经常看到的那些视频点赞量都是非常高的,而且被点击的概率也更高,可能你的朋友们也刷到了这个视频。所以抖音视频点赞量对于提高抖音视频热度是非

    测评 2021年11月11日