Merge "Synchronize the ArrayMap.put method calls." into main
diff --git a/core/java/android/app/BroadcastStickyCache.java b/core/java/android/app/BroadcastStickyCache.java
index fe2e107..0b6cf59 100644
--- a/core/java/android/app/BroadcastStickyCache.java
+++ b/core/java/android/app/BroadcastStickyCache.java
@@ -35,6 +35,7 @@
 import android.util.ArrayMap;
 import android.view.WindowManagerPolicyConstants;
 
+import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.ArrayUtils;
 
@@ -71,8 +72,10 @@
     @VisibleForTesting
     public static final ArrayMap<String, String> sActionApiNameMap = new ArrayMap<>();
 
+    @GuardedBy("BroadcastStickyCache.class")
     private static final ArrayMap<String, IpcDataCache.Config> sActionConfigMap = new ArrayMap<>();
 
+    @GuardedBy("BroadcastStickyCache.class")
     private static final ArrayMap<StickyBroadcastFilter, IpcDataCache<Void, Intent>>
             sFilterCacheMap = new ArrayMap<>();
 
@@ -154,37 +157,44 @@
             @Nullable String broadcastPermission,
             @UserIdInt int userId,
             @RegisterReceiverFlags int flags) {
-        IpcDataCache<Void, Intent> intentDataCache = findIpcDataCache(filter);
+        IpcDataCache<Void, Intent> intentDataCache;
 
-        if (intentDataCache == null) {
-            final String action = filter.getAction(0);
-            final StickyBroadcastFilter stickyBroadcastFilter =
-                    new StickyBroadcastFilter(filter, action);
-            final Config config = getConfig(action);
+        synchronized (BroadcastStickyCache.class) {
+            intentDataCache = findIpcDataCache(filter);
 
-            intentDataCache =
-                    new IpcDataCache<>(config,
-                            (query) -> ActivityManager.getService().registerReceiverWithFeature(
-                                    applicationThread,
-                                    mBasePackageName,
-                                    attributionTag,
-                                    /* receiverId= */ "null",
-                                    /* receiver= */ null,
-                                    filter,
-                                    broadcastPermission,
-                                    userId,
-                                    flags));
-            sFilterCacheMap.put(stickyBroadcastFilter, intentDataCache);
+            if (intentDataCache == null) {
+                final String action = filter.getAction(0);
+                final StickyBroadcastFilter stickyBroadcastFilter =
+                        new StickyBroadcastFilter(filter, action);
+                final Config config = getConfig(action);
+
+                intentDataCache =
+                        new IpcDataCache<>(config,
+                                (query) -> ActivityManager.getService().registerReceiverWithFeature(
+                                        applicationThread,
+                                        mBasePackageName,
+                                        attributionTag,
+                                        /* receiverId= */ "null",
+                                        /* receiver= */ null,
+                                        filter,
+                                        broadcastPermission,
+                                        userId,
+                                        flags));
+                sFilterCacheMap.put(stickyBroadcastFilter, intentDataCache);
+            }
         }
         return intentDataCache.query(null);
     }
 
     @VisibleForTesting
     public static void clearCacheForTest() {
-        sFilterCacheMap.clear();
+        synchronized (BroadcastStickyCache.class) {
+            sFilterCacheMap.clear();
+        }
     }
 
     @Nullable
+    @GuardedBy("BroadcastStickyCache.class")
     private static IpcDataCache<Void, Intent> findIpcDataCache(
             @NonNull IntentFilter filter) {
         for (int i = sFilterCacheMap.size() - 1; i >= 0; i--) {
@@ -198,6 +208,7 @@
     }
 
     @NonNull
+    @GuardedBy("BroadcastStickyCache.class")
     private static IpcDataCache.Config getConfig(@NonNull String action) {
         if (!sActionConfigMap.containsKey(action)) {
             // We only need 1 entry per cache but just to be on the safer side we are choosing 32