Replace ClassMemberUseCounter backing implementation with ConcurrentHashMultiset

- Per:[]
- Original Type: Map<Key, AtomicInteger>: You do not need a reference to an AtomicInteger; only int values that are always positive and less than 2^31

PiperOrigin-RevId: 294116974
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java b/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java
index d033715..fe28295 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java
@@ -21,6 +21,7 @@
 
 import com.google.auto.value.AutoValue;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ConcurrentHashMultiset;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -70,7 +71,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.Pattern;
 import javax.annotation.Nullable;
@@ -399,7 +399,7 @@
   private final LambdaClassMaker lambdas;
   private final GeneratedClassStore store = new GeneratedClassStore();
   private final ClassMemberUseCounter classMemberUseCounter =
-      new ClassMemberUseCounter(new ConcurrentHashMap<>());
+      new ClassMemberUseCounter(ConcurrentHashMultiset.create());
   private final Set<String> visitedExceptionTypes = new LinkedHashSet<>();
   /** The counter to record the times of try-with-resources desugaring is invoked. */
   private final AtomicInteger numOfTryWithResourcesInvoked = new AtomicInteger();
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberUseCounter.java b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberUseCounter.java
index ae4051b..43133f8 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberUseCounter.java
+++ b/src/tools/android/java/com/google/devtools/build/android/desugar/langmodel/ClassMemberUseCounter.java
@@ -16,36 +16,35 @@
 
 package com.google.devtools.build.android.desugar.langmodel;
 
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.atomic.LongAdder;
-import java.util.stream.Collectors;
+import static java.util.stream.Collectors.toCollection;
+
+import com.google.common.collect.ConcurrentHashMultiset;
 
 /** The counter used to track a class member use. */
 public final class ClassMemberUseCounter implements TypeMappable<ClassMemberUseCounter> {
 
   /** Tracks a class member with its associated count. */
-  private final ConcurrentMap<ClassMemberUse, LongAdder> memberUseCounter;
+  private final ConcurrentHashMultiset<ClassMemberUse> memberUseCounter;
 
-  public ClassMemberUseCounter(ConcurrentMap<ClassMemberUse, LongAdder> memberUseCounter) {
+  public ClassMemberUseCounter(ConcurrentHashMultiset<ClassMemberUse> memberUseCounter) {
     this.memberUseCounter = memberUseCounter;
   }
 
   /** Increases the member use count by one when an member access is encountered. */
-  public void incrementMemberUseCount(ClassMemberUse classMemberUse) {
-    memberUseCounter.computeIfAbsent(classMemberUse, k -> new LongAdder()).increment();
+  public boolean incrementMemberUseCount(ClassMemberUse classMemberUse) {
+    return memberUseCounter.add(classMemberUse);
   }
 
   /** Retrieves the total use count of a given class member. */
   public long getMemberUseCount(ClassMemberUse memberKey) {
-    return memberUseCounter.getOrDefault(memberKey, new LongAdder()).longValue();
+    return memberUseCounter.count(memberKey);
   }
 
   @Override
   public ClassMemberUseCounter acceptTypeMapper(TypeMapper typeMapper) {
     return new ClassMemberUseCounter(
-        memberUseCounter.keySet().stream()
-            .collect(
-                Collectors.toConcurrentMap(
-                    memberUse -> memberUse.acceptTypeMapper(typeMapper), memberUseCounter::get)));
+        memberUseCounter.stream()
+            .map(memberUse -> memberUse.acceptTypeMapper(typeMapper))
+            .collect(toCollection(ConcurrentHashMultiset::create)));
   }
 }