Disruptor高性能之道—无锁实现(CAS)
目录 一、前言 二、RingBuffer简介 三、依赖链 四、无锁竞争实现 1、生产者和消费者竞争实现 2、生产者和生产者竞争实现 3、消费者和消费者竞争实现 4、消费组内的消费者竞争实现 5、实现总结 五、惯例 一、前言 说到Disruptor都会提到其牛逼的性能,一说其性能大家都应该会想到它的无锁实现。大家都会说因为它是无锁实现的(重要因素,并不是唯一因素),所以它的性能很好。 那么它是怎样通过无锁的方式解决了多线程(消费者和生产者)之间的竞争呢?本文将给大家做一个基本的分析。 二、RingBuffer简介 熟悉或者了解Disruptor同学都知道,Disruptor采用了RingBuffer的数据结构来存储数据,而不是像BlockingQueue那样使用的队列。RingBuffer就是一个基于数据组实现的环形结构(如果还有不了解的同学,可以先行百度了解下)。生产者每生产一个数据就向前移动一格,而消费者每消费一个数据也向前移动一格。 图片来自网络 另外RingBuffer的大小是创建的时候就固定的,且其会预先分配好所有内存。即每个位置都会提前填充好对应的数据对象(一般是一个空对象)。然后每次生产者生成数据的时候仅仅是拿到这个位置的数据对象,然后将数据填充到(如通过setter)该对象中(该步骤由业务代码自己完成)。这样就避免了因频繁的创建和销毁对象而导致的不必要的对象回收