Disruptor 全解析(7) - 解密内存屏障(Memory Barrier)
long nextSequence = sequence + 1; while (running) { try { final long availableSequence = consumerBarrier.waitFor(nextSequence); while (nextSequence <= availableSequence) { entry = consumerBarrier.getEntry(nextSequence); handler.onAvailable(entry); nextSequence++; } handler.onEndOfBatch(); sequence = entry.getSequence(); } ... catch (final Exception ex) { exceptionHandler.handle(ex, entry); sequence = entry.getSequence(); nextSequence = entry.getSequence() + 1; } }?(你会注意到这儿还是“老”代码和命名规则,因为这篇文章紧接着我的上一篇博客,我想这样比直接切换到新命名规则会稍微减少一些混乱)?在上面的代码中,我们在消费者处理节点的循环中递增的是一个局部变量。这意味着我们读写 sequence 这个 volatile 字段(用粗体表示)的次数尽可能的降到了最低。?总结?内存屏障(Memory Barrier)是一个 CPU 指令,它允许你对数据在什么时候被其他进程可见作出确定的假设。在 Java 中,你可以用 volatile 关键字来实现它们。使用 volatile 关键字意味着你不需要被迫的、别无选择的加锁,而且使用还会让你获得性能提升。但是,这需要更加小心的思考你的设计,特别是你对 volatile 字段的使用有多频繁,以及读写它们有多频繁。?PS: 鉴于 Disruptor 当前的“世界新秩序?”与我至今为止博客里提到的一切相比,用的是完全不同的命名规则,我想下一篇文章是该把“旧世界”映射到“新世界”了。?译注?这是 Trisha Gee 博客里有关 Disruptor 原理介绍的最后一篇,其他的几篇介绍大家可以阅读我博客中的译文:?Disruptor 全解析(1):Ring Buffer 有什么特别??Disruptor 全解析(2):如何从 Ring Buffer 读取??Disruptor 全解析(3):写入 Ring Buffer?Disruptor 全解析(4):依赖关系组装?Disruptor 全解析(5):为什么它这么快 (一) - Locks Are Bad?Disruptor 全解析(6):为什么它这么快 (二) - 神奇的 cacheline 补齐??