Make AppIconCacheManager instance volatile to prevent thread caching
issue
Bug: 378525195
Test: atest
Flag: EXEMPT bug fix
Change-Id: I09c8eedfe05ef17affa910d6cfbc940bb4e29115
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/AppIconCacheManager.java b/packages/SettingsLib/src/com/android/settingslib/applications/AppIconCacheManager.java
index c0117b9..30ce13b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/AppIconCacheManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/AppIconCacheManager.java
@@ -22,6 +22,7 @@
import android.util.Log;
import android.util.LruCache;
+import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
/**
@@ -33,7 +34,7 @@
@VisibleForTesting
static final int MAX_CACHE_SIZE_IN_KB = getMaxCacheInKb();
private static final String DELIMITER = ":";
- private static AppIconCacheManager sAppIconCacheManager;
+ private static volatile AppIconCacheManager sAppIconCacheManager;
private final LruCache<String, Drawable> mDrawableCache;
private AppIconCacheManager() {
@@ -52,11 +53,18 @@
/**
* Get an {@link AppIconCacheManager} instance.
*/
- public static synchronized AppIconCacheManager getInstance() {
- if (sAppIconCacheManager == null) {
- sAppIconCacheManager = new AppIconCacheManager();
+ public static @NonNull AppIconCacheManager getInstance() {
+ AppIconCacheManager result = sAppIconCacheManager;
+ if (result == null) {
+ synchronized (AppIconCacheManager.class) {
+ result = sAppIconCacheManager;
+ if (result == null) {
+ result = new AppIconCacheManager();
+ sAppIconCacheManager = result;
+ }
+ }
}
- return sAppIconCacheManager;
+ return result;
}
/**
@@ -118,7 +126,7 @@
*
* @see android.content.ComponentCallbacks2#onTrimMemory(int)
*/
- public void trimMemory(int level) {
+ public static void trimMemory(int level) {
if (level >= android.content.ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
// Time to clear everything
if (sAppIconCacheManager != null) {