package io.pcp.parfait.timing; import java.util.concurrent.atomic.AtomicLong; import io.pcp.parfait.Counter; public interface ThreadCounter extends ThreadValue<AtomicLong>, Counter { public static class ThreadLocalCounter extends ThreadValue.ThreadLocalMap<AtomicLong> implements ThreadCounter { public ThreadLocalCounter() { super(new ThreadLocal<AtomicLong>() { @Override protected AtomicLong initialValue() { return new AtomicLong(); } }); } @Override public void inc() { inc(1L); } @Override public void inc(long increment) { threadLocal.get().addAndGet(increment); } } public static class ThreadMapCounter extends ThreadValue.WeakReferenceThreadMap<AtomicLong> implements ThreadCounter { public ThreadMapCounter() { super(); } @Override protected AtomicLong initialValue() { return new AtomicLong(); } @Override public void inc() { inc(1L); } @Override public void inc(long increment) { loadingCache.getUnchecked(Thread.currentThread()).addAndGet(increment); } } }