JCTools:JVM 并发工具集,提供高性能并发数据结构与扩展队列接口

为 JVM 提供丰富并发数据结构,包括 SPSC/MPSC/SPMC/MPMC 队列,支持无锁/无等待实现,扩展队列接口提升性能与吞吐量,Apache 2.0 许可,已被 Netty、RxJava 等框架采用。【此简介由AI生成】

Branch3Tags23
FilesLast commitLast update
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
11 years ago
2 months ago
7 years ago
7 months ago
12 years ago
1 month ago
2 months ago
2 months ago

CI Coverage Status

JCTools

JVM 的 Java 并发工具。本项目旨在提供一些 JDK 目前缺失的并发数据结构:

  • 适用于并发队列的 SPSC/MPSC/SPMC/MPMC 变体:

    • SPSC - 单生产者单消费者(无等待,有界和无界)
    • MPSC - 多生产者单消费者(无锁,有界和无界)
    • SPMC - 单生产者多消费者(无锁,有界)
    • MPMC - 多生产者多消费者(无锁,有界)
  • SPSC/MPSC 链接数组队列(有界和无界)在性能、内存分配和内存占用之间取得了平衡

  • 基于 MPSC/MPMC XAdd 的无界链接数组队列,通过使用 XADD 而非 CAS 循环降低了生产者的竞争成本,并通过池化队列块减少了内存分配

  • 扩展的队列接口(MessagePassingQueue):

    • relaxedOffer/Peek/Poll:通过权衡对队列满/空状态的一致性保证,换取性能提升
    • drain/fill:批量读写方法,以提高吞吐量并减少竞争
  • 阻塞消费者 MPSC 队列(MpscBlockingConsumerArrayQueue),适用于希望消费者阻塞而非自旋的场景,提供阻塞 drain 操作和基于阈值的 offerIfBelowThreshold 方法

  • Cliff Click 的 NonBlockingHashMap 及其相关实现(NonBlockingHashMapLong、NonBlockingIdentityHashMap、NonBlockingHashSet、NonBlockingSetInt)- 无锁映射和集合

  • 并发计数器(Counter/CountersFactory)- 带填充的原子计数器替代方案

许多队列都提供 Unsafe(默认,使用 sun.misc.Unsafe)和 Atomic(依赖 AtomicFieldUpdater)两种变体,以及 Unpadded(通过移除避免伪共享的字段填充来减小内存占用)变体。JDK11+ 用户还可以从 jctools-core-jdk11 工件中获取基于 VarHandle 的变体(带填充和无填充)—— 完全不使用 Unsafe,且性能优于 AtomicFieldUpdater 版本。

非常欢迎贡献和建议。JCTools 得到了社区的支持,问题/测试/文档/代码等形式的贡献帮助它不断发展。JCTools 以合理的价格(免费!基于 Apache 2.0 许可证)提供卓越的性能。它稳定可靠,已被 Netty、RxJava 等知名框架采用,并在商业产品中取得了良好的应用效果。

立即获取!

使用 Maven 将最新版本添加为依赖项:


<dependency>
    <groupId>org.jctools</groupId>
    <artifactId>jctools-core</artifactId>
    <version>4.0.6</version>
</dependency>

在 JDK11+ 上,您可以用 jctools-core-jdk11 替换 VarHandle 队列。它依赖于 jctools-core,因此您不仅能获得上述所有功能,还能得到新的变体:


<dependency>
    <groupId>org.jctools</groupId>
    <artifactId>jctools-core-jdk11</artifactId>
    <version>4.0.6</version>
</dependency>

温馨提示:4.0.4 版本发布时存在字节码版本错误,已由 4.0.5 版本取代,两个版本的源代码完全相同。如果您当前使用的是 4.0.4 版本,请升级至 4.0.5。同样,4.0.3 版本也只是 4.0.2 版本的重新打包,未包含任何代码变更。

您可以使用通过源代码构建的 https://jitpack.io/ 版本,但需要添加 Jitpack 仓库:


<repository>
    <id>jitpack.io</id>
    <url>https://jitpack.io</url>
</repository>

并设置以下依赖项:


<dependency>
    <groupId>com.github.JCTools.JCTools</groupId>
    <artifactId>jctools-core</artifactId>
    <version>v4.0.6</version>
</dependency>

您也可以依赖此仓库的最新快照(前沿版本),方法是将版本设置为 '5.0.0-SNAPSHOT' 并添加快照仓库:


<repository>
    <id>maven-snapshots</id>
    <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    <snapshots>
        <enabled>true</enabled>
    </snapshots>
</repository>

文档和发布说明

Javadoc 是参考文档,并且在包文档中隐藏了大量设计理念,因此请从这里开始: https://javadoc.io/doc/org.jctools/jctools-core

每个版本的发布说明都发布在 GitHub Releases 页面

包含内容

  • jctools-core - 队列、映射和计数器。这是您需要的工件。
  • jctools-core-jdk11 - 面向 JDK11+ 用户的 VarHandle 变体。依赖于 core。
  • jctools-build - 代码生成器。队列变体(AtomicUnpaddedVarHandle)是从 Unsafe 实现生成的,而非手写,这就是构建过程包含 generate-sources 步骤的原因。
  • jctools-benchmarks - JMH 和手动编写的基准测试,请参阅模块 README
  • jctools-concurrency-test - 基于 jcstress 的正确性测试工具。
  • jctools-channels - 用于线程间消息传递的堆外通道。
  • jctools-experimental - 请参见下文的“来实验室看看……”。

从源代码构建

JCTools 是使用 Maven 构建的,需要已安装的 Maven(3.5 或更高版本)和 JDK11 或更高版本。请注意,这是 构建 要求 - jctools-core 工件本身的目标是 Java 8。构建需要 11 是因为 jctools-core-jdk11 模块,VarHandle 代码位于此模块中。

将 'MAVEN_HOME/bin' 添加到路径中,并将 JDK11+ 设置为您的 'JAVA_HOME',您应该能够从此目录运行 "mvn install"。

发送补丁前需要了解两件事:

  • 格式是强制要求的。Spotless 在 'verify' 阶段运行,会导致构建失败,因此请运行 "mvn spotless:apply"。
  • 许多队列是生成的,因此请编辑基础实现(例如 SpscArrayQueue),切勿编辑生成的变体。 完整的 "mvn clean install" 会重新生成所有内容 - 如果您跳过此步骤,您的更改将看起来没有任何效果。

但我有一个零依赖/单一 jar 项目

虽然您可以自由复制和扩展 JCTools,但我们更希望您能以版本化依赖的方式使用 JCTools,以便获得更好的支持、升级路径和讨论。Maven/Gradle 的 shade 插件是将 JCTools 与您的库融合的首选方式。示例可在 ShadeJCToolsSamples 项目中找到。

对于关注模块的用户,这些 jar 同时包含 OSGi 和 JPMS 元数据 - jctools-core 是 bundle 和模块 org.jctools.core,并可选依赖于 jdk.unsupported(即 Unsafe)。

基准测试

JCTools 使用 JMH 基准测试和手动编写的测试工具进行基准测试。基准测试及相关说明可在 jctools-benchmarks 模块的 README 中找到。欢迎尝试,并请告知我们其在您的硬件上的表现。

并发测试

mvn package
cd jctools-concurrency-test
java -jar target/concurrency-test.jar -v

如果你更希望让别人的机器来处理,还有一个可手动触发的 jcstress GitHub Actions 工作流。

来实验室看看吧……

实验性工作位于 jctools-experimental 模块下。大多数内容的开发都着眼于最终将其移植到核心模块,在那里进行稳定化并发布,但有些实现纯粹是为了参考,还有一些可能永远不会升级。孩子,小心那只炸脖龙。

有问题?有建议?

讨论 JCTools 的最佳方式是通过 GitHub issues 系统。任何问题都是有价值的,而且 GitHub 提供了比 twitter/mailing-list/gitter 更好的知识共享平台(至少我们是这么认为的)。

谢谢!!!

我们有幸获得了 JetBrains 提供的 IntelliJ IDEA 许可证,以支持 JCTools 的开发。这是一套很棒的工具,让开发人员受益匪浅,并最终造福了整个社区。

这是一家令人惊叹且鼓舞人心的公司,现在就购买他们的产品吧!!!

JCTools 一直收到源源不断的 PR、建议和用户反馈。这是一个社区!感谢所有参与其中的人!

Introduction

为 JVM 提供丰富并发数据结构,包括 SPSC/MPSC/SPMC/MPMC 队列,支持无锁/无等待实现,扩展队列接口提升性能与吞吐量,Apache 2.0 许可,已被 Netty、RxJava 等框架采用。【此简介由AI生成】

Customize your domain
1803.87 K592Visit GitHub