Disruptor相比与传统的线程安全的阻塞队列(ArrayBlockingQueue)的改进:
1.内存结构
2.cas无锁操作
内存结构的改进主要有一下几点:
1.利用RingBuffer数据结构而不是数组构建队列底层数据,
好处是主要可以利用局部性原理这个规则,局部性原理主要包括时间局部性和空间局部性。
时间局部性指的是如果一条指令在某个时间点被访问,那么在接下来的一段时间也可能会被访问,而空间局部性原理指的是如果某个内存地址被访问,则与该内存地址相邻的地址空间也会被访问,所以cpu的高速缓存cache会同时缓存该地址空间的数据和相邻地址空间的数据。
所以RingBuffer 在构造数据时在初始化的时候就使用了整块相邻的地址空间。这样的好处是可以利用空间局部性原理提高cpu高速缓存的命中率。同时在初始化后,入队和出队只会修改该地址空间的值,通过set操作,而不是重新申请内存空间,同时可以提高GC效率。
同时内存空间的优化还包括cpu缓存行64位填充,如果不够64位,手动填充,避免伪共享内存情况,当然也是通过空间换取时间的方案。
总结来说,内存方面的优化主要有一下几点:
a。初始化时连续的内存空间来提高cpu高速缓存的利用率
b。出队和入队通过set操作而不是new操作来提高内存利用率,避免频繁GC
c。出队和入队索引通过缓存行填充,达到cpu缓存行64位的要求,从而避免伪共享情况的发生(单个索引变量的修改导致与其共享在同一个cpu缓存行上的变量索引失效)
2.cas无锁操作的性能还是要比传统意义上的管程效率要高一点
Disruptor高性能线程完全队列思考
最新推荐文章于 2023-08-17 14:11:37 发布