小编Kir*_*mit的帖子

通过JMH测量sun.misc.Unsafe.compareAndSwap中的奇怪行为

我决定用不同的锁定策略测量增量,并为此目的使用JMH.我正在使用JMH来检查吞吐量和平均时间以及用于检查正确性的简单自定义测试.有六种策略:

  • 原子计数
  • ReadWrite锁定计数
  • 与volatile同步
  • 同步块没有volatile
  • sun.misc.Unsafe.compareAndSwap
  • sun.misc.Unsafe.getAndAdd
  • 不同步计数

基准代码:

@State(Scope.Benchmark)
@BenchmarkMode({Mode.Throughput, Mode.AverageTime})
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Fork(1)
@Warmup(iterations = 5)
@Measurement(iterations = 5)
public class UnsafeCounter_Benchmark {
    public Counter unsync, syncNoV, syncV, lock, atomic, unsafe, unsafeGA;

    @Setup(Level.Iteration)
    public void prepare() {
        unsync = new UnsyncCounter();
        syncNoV = new SyncNoVolatileCounter();
        syncV = new SyncVolatileCounter();
        lock = new LockCounter();
        atomic = new AtomicCounter();
        unsafe = new UnsafeCASCounter();
        unsafeGA = new UnsafeGACounter();
    }

    @Benchmark
    public void unsyncCount() {
        unsyncCounter();
    }

    @CompilerControl(CompilerControl.Mode.DONT_INLINE)
    public void unsyncCounter() {
        unsync.increment(); …
Run Code Online (Sandbox Code Playgroud)

java cas microbenchmark jmh

5
推荐指数
1
解决办法
750
查看次数

标签 统计

cas ×1

java ×1

jmh ×1

microbenchmark ×1