Java并发框架——Disruptor为何能有这么高的性能

    第一点,我们来看一下Disruptor为何如此高效,大家都知道并发也就是多线程编程的场景下为了保证数据共享的安全性都会使用锁的方式解决,但是由此带来的负面影响就是性能问题了,俗话说的好——锁匙性能的杀手。加了锁就丢失了很多的性能,Disruptor做的以第一件事情就是消除锁的使用,Disruptor内部使用了一个环形队列维护的一个RingBuffer缓冲区,在这个基础上使任何一个任务都是有序曲执行,在一个时间点上保证了队列内每个元素只被一个线程所使用。其他线程处理队列其他的元素这样一来就保证了线程安全的问题,至于线程跟队列元素的具体交互细节这里就不多阐述,我们主要研究性能为什么这么高,当然只消除了锁的使用还没有完,Disruptor还沿用了cpu缓冲行的一个免费加载的特性去提高高速缓存的命中,这里说明一下cpu到主存的时间大约在60-80纳秒,cpu到缓冲的时间大约在1纳秒,如果命中的话就省去了59纳秒的时间,59纳米对于cpu或者对于高并发来说是很稀有的资源了。接下来咱们说一下cpu缓存行的概念,比如说现在有一个变量a和一个变量b这两个变量内存地址是相邻的,那么cpu在访问a变量的时间会把a变量加载到缓冲行上,缓冲行的免费加载特性会把相邻的b也加载进来尽管b变量对于当前的cpu来说是没有用的,并且会继续把b变量后面地址相邻的内存数据也加载到缓存行只要缓存行满为止。那么我们在编程的时间可以很好的利用缓冲行免费加载的特性来提高性能了,Disruptor就是这么做的,前面说了Disruptor内部维护了一个环形队列,这个队列是由数组实现的,大家都知道数组的特性就是一段内存地址连续的空间,那么cpu在加载队列内的一个元素进行处理的时间会把队列内当前元素的后续元素都加载到缓存行上面,队列只有序处理的那么也就是说缓存行上面的被免费加载的后续元素全部会命中,那么也就是说这个队列仅仅需要加载几次数据到缓存cpu就可以通过大量的命中去处理所有的元素。想想看每次命中节约59纳秒,这个性能提升也是不小的啦!  

    第一次写博客,按照我自己的话描述的我的理解,理解不对或者错误的地方欢迎指正,3q

你可能感兴趣的:(java,高并发,锁,disruptor,缓存行)