HTRACE-170. Optimize use of Random in htrace-core by using ThreadLocalRandom (Vladimir Sitnikov via Colin P. McCabe)
diff --git a/htrace-core/src/main/java/org/apache/htrace/Tracer.java b/htrace-core/src/main/java/org/apache/htrace/Tracer.java
index b8c4c1a..9463f41 100644
--- a/htrace-core/src/main/java/org/apache/htrace/Tracer.java
+++ b/htrace-core/src/main/java/org/apache/htrace/Tracer.java
@@ -23,6 +23,7 @@
import java.util.List;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ThreadLocalRandom;
/**
* A Tracer provides the implementation for collecting and distributing Spans
@@ -30,10 +31,10 @@
*/
public class Tracer {
public static final Log LOG = LogFactory.getLog(Tracer.class);
- private final static Random random = new Random();
static long nonZeroRandom64() {
long id;
+ Random random = ThreadLocalRandom.current();
do {
id = random.nextLong();
} while (id == 0);
diff --git a/htrace-core/src/main/java/org/apache/htrace/impl/CountSampler.java b/htrace-core/src/main/java/org/apache/htrace/impl/CountSampler.java
index fe98916..be5063e 100644
--- a/htrace-core/src/main/java/org/apache/htrace/impl/CountSampler.java
+++ b/htrace-core/src/main/java/org/apache/htrace/impl/CountSampler.java
@@ -20,6 +20,7 @@
import org.apache.htrace.Sampler;
import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
/**
* Sampler that returns true every N calls. Specify the frequency interval by configuring a
@@ -28,10 +29,8 @@
public class CountSampler implements Sampler<Object> {
public final static String SAMPLER_FREQUENCY_CONF_KEY = "sampler.frequency";
- final static Random random = new Random();
-
final long frequency;
- long count = random.nextLong();
+ long count = ThreadLocalRandom.current().nextLong();
public CountSampler(HTraceConfiguration conf) {
this.frequency = Long.parseLong(conf.get(SAMPLER_FREQUENCY_CONF_KEY), 10);
diff --git a/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java b/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java
index c688858..8544867 100644
--- a/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java
+++ b/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java
@@ -41,6 +41,7 @@
import java.util.List;
import java.util.Map;
import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
/**
* A Span implementation that stores its information in milliseconds since the
@@ -63,10 +64,10 @@
private Map<String, String> traceInfo = null;
private String processId;
private List<TimelineAnnotation> timeline = null;
- private final static Random random = new Random();
private static long nonZeroRandom64() {
long id;
+ Random random = ThreadLocalRandom.current();
do {
id = random.nextLong();
} while (id == 0);
diff --git a/htrace-core/src/main/java/org/apache/htrace/impl/ProbabilitySampler.java b/htrace-core/src/main/java/org/apache/htrace/impl/ProbabilitySampler.java
index 3c08c84..e6e4894 100644
--- a/htrace-core/src/main/java/org/apache/htrace/impl/ProbabilitySampler.java
+++ b/htrace-core/src/main/java/org/apache/htrace/impl/ProbabilitySampler.java
@@ -22,6 +22,7 @@
import org.apache.htrace.Sampler;
import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
/**
* Sampler that returns true a certain percentage of the time. Specify the frequency interval by
@@ -30,7 +31,6 @@
public class ProbabilitySampler implements Sampler<Object> {
private static final Log LOG = LogFactory.getLog(ProbabilitySampler.class);
public final double threshold;
- private Random random = new Random();
public final static String SAMPLER_FRACTION_CONF_KEY = "sampler.fraction";
public ProbabilitySampler(HTraceConfiguration conf) {
@@ -43,6 +43,6 @@
@Override
public boolean next(Object info) {
- return random.nextDouble() < threshold;
+ return ThreadLocalRandom.current().nextDouble() < threshold;
}
}
diff --git a/htrace-core/src/test/java/org/apache/htrace/TraceCreator.java b/htrace-core/src/test/java/org/apache/htrace/TraceCreator.java
index f79b01a..7ec6309 100644
--- a/htrace-core/src/test/java/org/apache/htrace/TraceCreator.java
+++ b/htrace-core/src/test/java/org/apache/htrace/TraceCreator.java
@@ -18,6 +18,7 @@
import java.util.Collection;
import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
import org.apache.htrace.Sampler;
import org.apache.htrace.SpanReceiver;
@@ -80,7 +81,7 @@
public void createThreadedTrace() {
TraceScope s = Trace.startSpan(THREADED_TRACE_ROOT, Sampler.ALWAYS);
try {
- Random r = new Random();
+ Random r = ThreadLocalRandom.current();
int numThreads = r.nextInt(4) + 1;
Thread[] threads = new Thread[numThreads];
@@ -130,7 +131,7 @@
public void run() {
try {
Thread.sleep(750);
- Random r = new Random();
+ Random r = ThreadLocalRandom.current();
int importantNumber = 100 / r.nextInt(3);
System.out.println("Important number: " + importantNumber);
} catch (InterruptedException ie) {