Remove synchronized on Tracer#getInstance
Move to the initialization on demand holder idiom to remove lock
contention after first initialization.
diff --git a/htrace-core/src/main/java/org/cloudera/htrace/Tracer.java b/htrace-core/src/main/java/org/cloudera/htrace/Tracer.java
index 4fc1441..60ff972 100644
--- a/htrace-core/src/main/java/org/cloudera/htrace/Tracer.java
+++ b/htrace-core/src/main/java/org/cloudera/htrace/Tracer.java
@@ -42,13 +42,17 @@
public static final TraceInfo DONT_TRACE = new TraceInfo(-1, -1);
protected static String processId = null;
- private static Tracer instance = null;
+ /**
+ * Internal class for defered singleton idiom.
+ *
+ * https://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom
+ */
+ private static class TracerHolder {
+ private static final Tracer INSTANCE = new Tracer();
+ }
- synchronized protected static Tracer getInstance() {
- if (instance == null) {
- instance = new Tracer();
- }
- return instance;
+ protected static Tracer getInstance() {
+ return TracerHolder.INSTANCE;
}
protected Span createNew(String description) {