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)

相关推荐

  • 微信sdk里有没有验证签名的方法(微信两个项目共用jssdk签名)

    技术微信JS-SDK签名接口怎么用这篇文章给大家分享的是有关微信JS-SDK签名接口怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先我们看一下微信公众号开发关于微信JS-SDK的使用说

    攻略 2021年12月24日
  • C语言编程核心要点是什么

    技术C语言编程核心要点是什么这篇文章主要讲解了“C语言编程核心要点是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言编程核心要点是什么”吧!C精简的语法集和标准库

    攻略 2021年11月1日
  • VBS如何读取配置文件配置项

    技术VBS如何读取配置文件配置项这篇文章主要为大家展示了“VBS如何读取配置文件配置项”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VBS如何读取配置文件配置项”这篇文章吧。

    攻略 2021年11月1日
  • Web中二次注入攻击原理的示例分析

    技术Web中二次注入攻击原理的示例分析这篇文章主要介绍Web中二次注入攻击原理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!二次注入攻击二次注入攻击的测试地址:http://127.0.

    攻略 2021年11月7日
  • Shell命令之ls

    技术Shell命令之ls Shell命令之lsls 命令,list 的缩写,是最常见的目录操作命令,其主要功能是显示当前目录下的内容。此命令的基本格式为:[root@localhost ~]# ls [

    礼包 2021年12月7日
  • 九价疫苗,九价HPV疫苗为什么这么火

    技术九价疫苗,九价HPV疫苗为什么这么火HPV也就是人乳头瘤病毒是许多生殖系统癌症比如宫颈癌的罪魁祸首,而针对这个病毒所研发的疫苗也就是所谓的二价疫苗、四价疫苗以及功能最为强大、最近出现的九价疫苗九价疫苗。九价疫苗的作用

    生活 2021年10月28日