Java枚举本身不直接参与并发执行,而是作为结构化、类型安全的并发配置源,用于驱动JMH基准测试中的线程数、负载模式等参数组合,提升可维护性与语义清晰度。

Java 枚举本身不直接参与并发执行,但在基准测试(如 JMH)中,它可以作为**结构化、类型安全、可枚举的并发级别配置源**,用于驱动不同线程数、负载模式或执行策略的测试场景。关键不是“枚举并发”,而是用枚举来**统一建模和管理并发参数组合**,提升测试可维护性与语义清晰度。
定义并发级别枚举
把常见的并发规模抽象为枚举常量,每个常量封装线程数、预热轮次、测量轮次等配置,避免硬编码数字:
- 类型安全:防止传入非法数值(如 -5 或 1000000),编译期即校验
-
语义明确:
CONCURRENCY_LOW比4更易理解其业务含义 - 集中管理:新增/调整并发档位只需改枚举,无需遍历多处测试方法
在 JMH 中通过参数注入驱动测试
JMH 不支持直接用 @EnumSource(那是 JUnit 5 的),但可通过 静态枚举实例 + @Param 配合自定义 setup 实现等效效果:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 声明
@State(Scope.Benchmark)类,字段类型为枚举(如ConcurrencyLevel level) - 用
@Param注解该字段,并在public static enum ConcurrencyLevel { LOW(4), MEDIUM(16), HIGH(64) }中定义值 - JMH 会自动为每个枚举值生成独立的 benchmark 子任务,分别运行对应配置
- 在
@Setup方法中,根据level初始化线程池大小、请求批次等参数
结合枚举实现策略化并发行为
让枚举不只是数据容器,还可携带并发执行逻辑:
立即学习“Java免费学习笔记(深入)”;
- 枚举实现接口(如
ConcurrentStrategy),每个常量重写runWith(ExecutorService)方法 - 例如:
PARALLEL_STREAM调用list.parallelStream().forEach(...);FIXED_THREAD_POOL创建Executors.newFixedThreadPool(level.threads()) - 基准测试中只需调用
level.execute(task),逻辑隔离、易于替换对比
规避常见陷阱
使用时需注意:
- 不要在枚举构造中初始化共享资源(如 static 线程池),JMH 多 fork 模式下可能引发状态污染
-
避免依赖枚举序号(
ordinal())做并发计算,应显式定义字段(如int threadCount),保证可读与稳定 -
枚举值必须是 JVM 内唯一实例,集群环境跨 JVM 比较仍可用
==,但序列化后反序列化需用valueOf()而非==


















