从零开始实现lmax-Disruptor队列(六)Disruptor 解决伪共享、消费者优雅停止实现原理解析

Java27

在v5版本的MyDisruptor实现DSL风格的API后。按照计划,v6版本的MyDisruptor作为最后一个版本,需要对MyDisruptor进行最终的一些细节优化。
v6版本一共做了三处优化:

  • 解决伪共享问题
  • 支持消费者线程优雅停止
  • 生产者序列器中维护消费者序列集合的数据结构由ArrayList优化为数组Array类型(减少ArrayList在get操作时额外的rangeCheck检查)

由于这篇文章是一系列博客的一部分,我们需要了解前一篇博客的内容,以便更好地理解这篇博客。

[En]

Since the article is part of a series of blogs, we need to know the content of the previous blog in order to better understand this blog.

在第一篇博客中我们就已经介绍过伪共享问题了,这里复制原博客内容如下:
现代的CPU都是多核的,每个核心都拥有独立的高速缓存。高速缓存由固定大小的缓存行组成(通常为32个字节或64个字节)。CPU以缓存行作为最小单位读写,且一个缓存行通常会被多个变量占据(例如32位的引用指针占4字节,64位的引用指针占8个字节)。
这样的设计导致了一个问题:即使缓存行上的变量是无关联的(比如不属于同一个对象),但只要缓存行上的某一个共享变量发生了变化,则整个缓存行都会进行缓存一致性的同步。
而CPU间缓存一致性的同步是有一定性能损耗的,能避免则尽量避免。这就是所谓的" 伪共享 "问题。
disruptor通过对队列中一些关键变量进行了缓存行的填充,避免其因为不相干的变量读写而无谓的刷新缓存,解决了伪共享的问题。

  • 假设存在一个Point对象,其中有两个volatile修饰的long类型字段,x和y。
    有两个线程并发的访问一个Point对象,但其中一个线程1只读写x字段,而另一个线程2只读写y字段。

```java
public class Point {

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
Java

Java JavaMail通过SMPT发送邮件

概述 本讲讲述如何使用JavaMail工具包,通过SMPT协议,在Java代码中发送邮件。 一、JavaMail简介 JavaMail API提供了一个独立于平台且与协议无关的框架来构建邮件和消息传递...
Java

CMS前世今生

CMS一直是面试中的常考点,今天我们用通俗易懂的语言简单介绍下。 垃圾回收器为什么要分区分代? 如上图:JVM虚拟机将堆内存区域分代了,先生代是朝生夕死的区域,老年代是老不死的区域,不同的年代对象有不...
Java

ch03 Java基础

JAVA基础 JAVA基础 数据类型 类型转换 变量 类变量和实例变量的区别和联系 常量 变量命名规范 运算符 位运算 包机制 JavaDoc 数据类型 强类型语言 要求变量的使用要严格符合规定,所有...
Java

MySQL 事务常见面试题总结 | JavaGuide

《Java 面试指北》来啦!这是一份教你如何更高效地准备面试的小册,涵盖常见八股文(系统设计、常见框架、分布式、高并发 ......)、优质面经等内容。 本文原发于 MySQL知识点&面试题总...
Java

shiro中常用的对象和方法

一.配置类中常用的对象和方法 1.ShiroFilterFactoryBean()对象:通过创建的该对象调用setSecurityManager方法去关联DefaultWebSecurityManag...
Java

docker

一.Docker入门 1. Docker 为什么会出现 Docker是基于Go语言开发的!开源项目 4.1. 虚拟化技术的缺点 资源占用十分多 冗余步骤多 启动很慢 2.2. 容器化技术 比较Dock...
Java

第24章 Java 数据类型转换

井底点灯深烛伊,共郎长行莫围棋。 What we call "failure" is not falling down, but the staying down. 所谓"失败"不是跌倒,而是就此躺平...
Java

docker安装redis

拉取镜像 默认拉取最新 docker pull redis 设置配置文件 bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问 protected-mode no #默认yes...
Java

Mybatis SqlNode源码解析

1.ForEachSqlNode mybatis的foreach标签可以将列表、数组中的元素拼接起来,中间可以指定分隔符separator <select id="getByUserI...
Java

PotPlayer播放百度云盘视频

需要的工具 PotPlayer、油猴tampermonkey、坚果(这个不用下载,有个账号就行) 下载地址:百度网盘 步骤 安装油猴tampermonkey 拖拽 Tampermonkey_4.14....