在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 {
相关文章
Java JavaMail通过SMPT发送邮件
概述 本讲讲述如何使用JavaMail工具包,通过SMPT协议,在Java代码中发送邮件。 一、JavaMail简介 JavaMail API提供了一个独立于平台且与协议无关的框架来构建邮件和消息传递...
sql题 部门工资前三高的所有员工
此题为sql困难题,值得记录一下 题目描述 来自力扣第185题 ``` 输入: Employee 表: +----+-------+--------+----...
浅谈Java-String到底是值传递还是引用传递?
参数传递 Java 中的参数传递分为 "值传递""引用传递" 如果你学过 C/C++应该很好理解,就是所谓的 "值传递" 和 "指针传递" 值传递 在 Java 中,"值传递" 就是传递真实值的一个副...
【Java分享客栈】SpringBoot整合WebSocket+Stomp搭建群聊项目
前言 前两周经常有大学生小伙伴私信给我,问我可否有偿提供毕设帮助,我说暂时没有这个打算,因为工作实在太忙,现阶段无法投入到这样的领域内,其中有两个小伙伴又问到我websocket该怎么使用,想给自己的...
谈谈对不同I/O模型的理解 (阻塞/非阻塞IO,同步/异步IO)
一、关于I/O模型的问题 最近通过对ucore操作系统的学习,让我打开了操作系统内核这一黑盒子,与之前所学知识结合起来,解答了长久以来困扰我的关于I/O的一些问题。 1. 为什么redis能以单工作线...
ch03 Java基础
JAVA基础 JAVA基础 数据类型 类型转换 变量 类变量和实例变量的区别和联系 常量 变量命名规范 运算符 位运算 包机制 JavaDoc 数据类型 强类型语言 要求变量的使用要严格符合规定,所有...
MySQL 事务常见面试题总结 | JavaGuide
《Java 面试指北》来啦!这是一份教你如何更高效地准备面试的小册,涵盖常见八股文(系统设计、常见框架、分布式、高并发 ......)、优质面经等内容。 本文原发于 MySQL知识点&面试题总...
shiro中常用的对象和方法
一.配置类中常用的对象和方法 1.ShiroFilterFactoryBean()对象:通过创建的该对象调用setSecurityManager方法去关联DefaultWebSecurityManag...
第24章 Java 数据类型转换
井底点灯深烛伊,共郎长行莫围棋。 What we call "failure" is not falling down, but the staying down. 所谓"失败"不是跌倒,而是就此躺平...
docker安装redis
拉取镜像 默认拉取最新 docker pull redis 设置配置文件 bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问 protected-mode no #默认yes...
Mybatis SqlNode源码解析
1.ForEachSqlNode mybatis的foreach标签可以将列表、数组中的元素拼接起来,中间可以指定分隔符separator <select id="getByUserI...
PotPlayer播放百度云盘视频
需要的工具 PotPlayer、油猴tampermonkey、坚果(这个不用下载,有个账号就行) 下载地址:百度网盘 步骤 安装油猴tampermonkey 拖拽 Tampermonkey_4.14....
「Java分享客栈」随时用随时翻:微服务链路追踪之zipkin搭建
前言 微服务治理方案中,链路追踪是必修课,SpringCloud的组件其实使用很简单,生产环境中真正令人头疼的往往是软件维护,接口在微服务间的调用究竟哪个环节出现了问题,哪个环节耗时较长,这都是项目上...