If we're on Java 7, and Dropwizard metrics core happens to be present, use their LongAdder rather than falling back to the Java 7 AtomicLong.

pull/333/head
Brett Wooldridge 10 years ago
parent b0df3a82c7
commit aaa58a548b

@ -16,6 +16,9 @@
package com.zaxxer.hikari.util; package com.zaxxer.hikari.util;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAdder; import java.util.concurrent.atomic.LongAdder;
@ -44,21 +47,22 @@ public interface Sequence
/** /**
* Factory class used to create a platform-specific ClockSource. * Factory class used to create a platform-specific ClockSource.
*/ */
class Factory final class Factory
{ {
@SuppressWarnings("serial") @SuppressWarnings("serial")
public static Sequence create() public static Sequence create()
{ {
class Java7Sequence extends AtomicLong implements Sequence { final class Java7Sequence extends AtomicLong implements Sequence {
Java7Sequence() { Java7Sequence() {
} }
@Override
public void increment() { public void increment() {
this.incrementAndGet(); this.incrementAndGet();
} }
} }
class Java8Sequence extends LongAdder implements Sequence { final class Java8Sequence extends LongAdder implements Sequence {
public Java8Sequence() { public Java8Sequence() {
} }
@ -68,16 +72,59 @@ public interface Sequence
} }
} }
Sequence sequence = null; final class DropwizardSequence implements Sequence {
private final Object longAdder;
private final Method increment;
private final Method sum;
public DropwizardSequence(Class<?> longAdderClass) throws Exception {
Constructor<?> constructor = longAdderClass.getDeclaredConstructors()[0];
constructor.setAccessible(true);
increment = longAdderClass.getMethod("increment");
increment.setAccessible(true);
sum = longAdderClass.getMethod("sum");
sum.setAccessible(true);
longAdder = constructor.newInstance();
}
@Override
public void increment()
{
try {
increment.invoke(longAdder);
}
catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}
@Override
public long get()
{
try {
return (Long) sum.invoke(longAdder);
}
catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}
}
try { try {
if (Sequence.class.getClassLoader().loadClass("java.util.concurrent.atomic.LongAdder") != null) { if (Sequence.class.getClassLoader().loadClass("java.util.concurrent.atomic.LongAdder") != null) {
sequence = new Java8Sequence(); return new Java8Sequence();
} }
} }
catch (ClassNotFoundException e) { catch (ClassNotFoundException e) {
try {
Class<?> longAdderClass = Sequence.class.getClassLoader().loadClass("com.codahale.metrics.LongAdder");
return new DropwizardSequence(longAdderClass);
}
catch (Exception e2) {
}
} }
return sequence != null ? sequence : new Java7Sequence(); return new Java7Sequence();
} }
} }
} }

Loading…
Cancel
Save