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) {