针对多核可扩展的计数器
并发计数器有下面几种实现:
- 同步Synchronized – 只能在 JDK 1.5之前使用, 等待JDK8 期间,不选择这个选项。
- 基于锁Lock based -非常差
- 等待免费Wait Free – Java 不支持 Fetch-and-add,
- 锁免费Lock free – Java支持 Compare-and-swap, 使用这个选项。
测试结果:
CAS 失败 率
结论:
- 为了降低竞争,用多个计数器然后聚合。
- Core based counter 在核数较少时很好。
- Thread based counter 当线程数比可用CPU核数多得多时很好
- Thread based 使用了JDK8的 LongAdder , 能创建很多slots降低竞争。