package ex2; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.LongAdder; public final class Profiler { private static final Map, Boolean> isThread = new ConcurrentHashMap<>(); private static final LongAdder reads = new LongAdder(); private static final LongAdder writes = new LongAdder(); static { Runtime.getRuntime().addShutdownHook(new Thread(() -> { System.out.printf("Instance field read access: %d\nInstance field write access: %d\n", reads.longValue(), writes.longValue()); })); } private Profiler() { } public static boolean isThread(final Class clazz) { return isThread.computeIfAbsent(clazz, Thread.class::isAssignableFrom); } public static void increment(long readCount, long writeCount) { reads.add(readCount); writes.add(writeCount); } }