为 JVM 提供丰富并发数据结构,包括 SPSC/MPSC/SPMC/MPMC 队列,支持无锁/无等待实现,扩展队列接口提升性能与吞吐量,Apache 2.0 许可,已被 Netty、RxJava 等框架采用。【此简介由AI生成】
| Files | Last commit | Last 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 |
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 - 代码生成器。队列变体(
Atomic、Unpadded、VarHandle)是从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