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)

相关推荐

  • 0元刷抖音粉,刷抖音粉丝的好处有哪些?

    技术0元刷抖音粉,刷抖音粉丝的好处有哪些?抖音粉丝数量少怎么办?如何刷抖音粉丝呢?很多玩抖音的小伙伴都有刷粉丝的需求,那么今天小编就来教大家如何快速刷抖音粉丝吧,其实也不难,只要用心学肯定能学会。
    迫不及待想涨粉的现在可

    测评 2021年10月19日
  • Python中Gevent怎么用

    技术Python中Gevent怎么用这篇文章主要为大家展示了“Python中Gevent怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python中Gevent怎么用”

    攻略 2021年10月27日
  • Python源代码的编制技巧是什么

    技术Python源代码的编制技巧是什么本篇文章为大家展示了Python源代码的编制技巧是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。下面进行详细说明Python源代码的编程

    攻略 2021年10月28日
  • 和的立方,自然数立方和公式的推导

    技术和的立方,自然数立方和公式的推导平方和的推导利用立方公式和的立方:(n+1)³-n³=3n²+3n+1 ①记Sn=1²+2²+.+n², Tn=1+2+..+n=n(n+1)/2
    对①式从1

    生活 2021年10月29日
  • Python学习笔记:pd.filter、query筛选数据

    技术Python学习笔记:pd.filter、query筛选数据 Python学习笔记:pd.filter、query筛选数据一、pd.filter函数
    1.介绍
    pd.filter 函数根据指定的索引

    礼包 2021年11月1日
  • 使用Ubuntu自带远程桌面

    技术使用Ubuntu自带远程桌面 使用Ubuntu自带远程桌面背景
    工作总偶尔需要使用到图形界面调试,对于不支持x11转发的程序无法依靠ssh -X实现,需要借助远程桌面工具。
    常用的平台包括 向日葵

    礼包 2021年11月7日