diff --git a/config/preloaded-classes-denylist b/config/preloaded-classes-denylist index 502d8c6dadb12..02f2df6167a57 100644 --- a/config/preloaded-classes-denylist +++ b/config/preloaded-classes-denylist @@ -9,4 +9,3 @@ android.net.rtp.AudioGroup android.net.rtp.AudioStream android.net.rtp.RtpStream java.util.concurrent.ThreadLocalRandom -com.android.internal.jank.InteractionJankMonitor$InstanceHolder diff --git a/core/java/com/android/internal/jank/InteractionJankMonitor.java b/core/java/com/android/internal/jank/InteractionJankMonitor.java index d066945cb92d4..72de78c148f8c 100644 --- a/core/java/com/android/internal/jank/InteractionJankMonitor.java +++ b/core/java/com/android/internal/jank/InteractionJankMonitor.java @@ -292,10 +292,7 @@ public class InteractionJankMonitor { UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_CLEAR_ALL, }; - private static class InstanceHolder { - public static final InteractionJankMonitor INSTANCE = - new InteractionJankMonitor(new HandlerThread(DEFAULT_WORKER_NAME)); - } + private static volatile InteractionJankMonitor sInstance; private final DeviceConfig.OnPropertiesChangedListener mPropertiesChangedListener = this::updateProperties; @@ -387,7 +384,15 @@ public class InteractionJankMonitor { * @return instance of InteractionJankMonitor */ public static InteractionJankMonitor getInstance() { - return InstanceHolder.INSTANCE; + // Use DCL here since this method might be invoked very often. + if (sInstance == null) { + synchronized (InteractionJankMonitor.class) { + if (sInstance == null) { + sInstance = new InteractionJankMonitor(new HandlerThread(DEFAULT_WORKER_NAME)); + } + } + } + return sInstance; } /**