Introduce BlazeInterners, a Blaze-specific wrapper around Guava's Interners that makes an appropriate call to Interners.InternerBuilder#concurrencyLevel.

For current readers of this CL, I used this class everywhere in the Blaze codebase.

For future readers of this CL, this class should be used to create an Interner in the Blaze codebase.

--
MOS_MIGRATED_REVID=140063271
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
index 753909c..0fb7a08 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
@@ -17,8 +17,8 @@
 import com.google.common.collect.ComparisonChain;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
 import com.google.devtools.build.lib.cmdline.LabelValidator.BadLabelException;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
@@ -74,7 +74,7 @@
 
   public static final String EXTERNAL_PATH_PREFIX = "external";
 
-  private static final Interner<Label> LABEL_INTERNER = Interners.newWeakInterner();
+  private static final Interner<Label> LABEL_INTERNER = BlazeInterners.newWeakInterner();
 
   /**
    * Factory for Labels from absolute string form. e.g.
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
index 905866f..ba48f7a 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
@@ -16,7 +16,7 @@
 
 import com.google.common.collect.ComparisonChain;
 import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.lib.vfs.Canonicalizer;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -36,7 +36,7 @@
 @Immutable
 public final class PackageIdentifier implements Comparable<PackageIdentifier>, Serializable {
 
-  private static final Interner<PackageIdentifier> INTERNER = Interners.newWeakInterner();
+  private static final Interner<PackageIdentifier> INTERNER = BlazeInterners.newWeakInterner();
 
   public static PackageIdentifier create(String repository, PathFragment pkgName)
       throws LabelSyntaxException {
diff --git a/src/main/java/com/google/devtools/build/lib/concurrent/BlazeInterners.java b/src/main/java/com/google/devtools/build/lib/concurrent/BlazeInterners.java
new file mode 100644
index 0000000..d54793d
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/concurrent/BlazeInterners.java
@@ -0,0 +1,35 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.concurrent;
+
+import com.google.common.collect.Interner;
+import com.google.common.collect.Interners;
+import com.google.common.collect.Interners.InternerBuilder;
+
+/** Wrapper around {@link Interners}, with Blaze-specific predetermined concurrency levels. */
+public class BlazeInterners {
+  private static final int CONCURRENCY_LEVEL = Runtime.getRuntime().availableProcessors();
+
+  private static InternerBuilder setConcurrencyLevel(InternerBuilder builder) {
+    return builder.concurrencyLevel(CONCURRENCY_LEVEL);
+  }
+
+  public static <T> Interner<T> newWeakInterner() {
+    return setConcurrencyLevel(Interners.newBuilder().weak()).build();
+  }
+
+  public static <T> Interner<T> newStrongInterner() {
+    return setConcurrencyLevel(Interners.newBuilder().strong()).build();
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java b/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java
index 911097f..3ecf6fe 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java
@@ -20,10 +20,10 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.TreeTraverser;
 import com.google.devtools.build.lib.actions.ActionInput;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.remote.RemoteProtocol.ContentDigest;
@@ -172,7 +172,7 @@
   }
 
   // Keep only one canonical instance of every TreeNode in the repository.
-  private final Interner<TreeNode> interner = Interners.newWeakInterner();
+  private final Interner<TreeNode> interner = BlazeInterners.newWeakInterner();
   // Merkle hashes are computed and cached by the repository, therefore execRoot must
   // be part of the state.
   private final Path execRoot;
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FunctionSignature.java b/src/main/java/com/google/devtools/build/lib/syntax/FunctionSignature.java
index 7643201..2903f8e 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FunctionSignature.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FunctionSignature.java
@@ -16,8 +16,8 @@
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
 import com.google.common.collect.Lists;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.lib.util.StringCanonicalizer;
@@ -71,7 +71,7 @@
    */
   @AutoValue
   public abstract static class Shape implements Serializable {
-    private static final Interner<Shape> interner = Interners.newWeakInterner();
+    private static final Interner<Shape> interner = BlazeInterners.newWeakInterner();
 
     /** Create a function signature */
     public static Shape create(
@@ -154,7 +154,8 @@
   }
 
   /** Names of a FunctionSignature */
-  private static final Interner<ImmutableList<String>> namesInterner = Interners.newWeakInterner();
+  private static final Interner<ImmutableList<String>> namesInterner =
+      BlazeInterners.newWeakInterner();
 
   /** Intern a list of names */
   public static ImmutableList<String> names(List<String> names) {
@@ -168,7 +169,8 @@
   }
 
   // Interner
-  private static final Interner<FunctionSignature> signatureInterner = Interners.newWeakInterner();
+  private static final Interner<FunctionSignature> signatureInterner =
+      BlazeInterners.newWeakInterner();
 
   /**
    * Signatures proper.
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java
index d6695cb..87fa012 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkType.java
@@ -20,8 +20,8 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
@@ -377,7 +377,7 @@
     }
 
     private static final Interner<Combination> combinationInterner =
-        Interners.<Combination>newWeakInterner();
+        BlazeInterners.<Combination>newWeakInterner();
 
     public static SkylarkType of(SkylarkType generic, SkylarkType argument) {
       // assume all combinations with TOP are the same as the simple type, and canonicalize.
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/Canonicalizer.java b/src/main/java/com/google/devtools/build/lib/vfs/Canonicalizer.java
index 8b47ea8..5243c0b 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/Canonicalizer.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/Canonicalizer.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.vfs;
 
 import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
 
 /**
  * Static singleton holder for certain interning pools.
@@ -22,7 +22,7 @@
 public final class Canonicalizer<E> {
 
   private static final Interner<PathFragment> FRAGMENT_INTERNER =
-      Interners.newWeakInterner();
+      BlazeInterners.newWeakInterner();
 
   /**
    * Creates an instance of Canonicalizer tracking path fragments.
diff --git a/src/main/java/com/google/devtools/build/skyframe/IntVersion.java b/src/main/java/com/google/devtools/build/skyframe/IntVersion.java
index 68a2cfa..3f3761a 100644
--- a/src/main/java/com/google/devtools/build/skyframe/IntVersion.java
+++ b/src/main/java/com/google/devtools/build/skyframe/IntVersion.java
@@ -14,11 +14,11 @@
 package com.google.devtools.build.skyframe;
 
 import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
 
 /** Versioning scheme based on integers. */
 final class IntVersion implements Version {
-  private static final Interner<IntVersion> interner = Interners.newWeakInterner();
+  private static final Interner<IntVersion> interner = BlazeInterners.newWeakInterner();
 
   private final long val;
 
diff --git a/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtilImpl.java b/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtilImpl.java
index 73c179d..801b0d3 100644
--- a/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtilImpl.java
+++ b/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtilImpl.java
@@ -17,10 +17,10 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.devtools.build.lib.collect.CompactHashSet;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.util.Preconditions;
 
 import java.util.ArrayList;
@@ -46,7 +46,8 @@
 
   static final int MAYBE_CHECK_THRESHOLD = 10;
 
-  private static final Interner<KeyToConsolidate> consolidateInterner = Interners.newWeakInterner();
+  private static final Interner<KeyToConsolidate> consolidateInterner =
+      BlazeInterners.newWeakInterner();
 
   abstract void setReverseDepsObject(T container, Object object);
 
diff --git a/src/main/java/com/google/devtools/build/skyframe/SkyKey.java b/src/main/java/com/google/devtools/build/skyframe/SkyKey.java
index f2355e1..0af8b82 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SkyKey.java
+++ b/src/main/java/com/google/devtools/build/skyframe/SkyKey.java
@@ -15,7 +15,7 @@
 
 import com.google.common.base.Function;
 import com.google.common.collect.Interner;
-import com.google.common.collect.Interners;
+import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.util.Preconditions;
 
 import java.io.Serializable;
@@ -24,7 +24,7 @@
  * A {@link SkyKey} is effectively a pair (type, name) that identifies a Skyframe value.
  */
 public final class SkyKey implements Serializable {
-  private static final Interner<SkyKey> SKY_KEY_INTERNER = Interners.newWeakInterner();
+  private static final Interner<SkyKey> SKY_KEY_INTERNER = BlazeInterners.newWeakInterner();
 
   private final SkyFunctionName functionName;