DCL is broken and should not be used.
Use the acceptable instance holder pattern as a replacement.
Change-Id: I2fb29edd48e00ac36a7fb0907a21ae5ca1d5163f
diff --git a/config/preloaded-classes-denylist b/config/preloaded-classes-denylist
index 02f2df6..502d8c6 100644
--- a/config/preloaded-classes-denylist
+++ b/config/preloaded-classes-denylist
@@ -9,3 +9,4 @@
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 6e8a0c7..fc4e041 100644
--- a/core/java/com/android/internal/jank/InteractionJankMonitor.java
+++ b/core/java/com/android/internal/jank/InteractionJankMonitor.java
@@ -293,7 +293,10 @@
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_CLEAR_ALL,
};
- private static volatile InteractionJankMonitor sInstance;
+ private static class InstanceHolder {
+ public static final InteractionJankMonitor INSTANCE =
+ new InteractionJankMonitor(new HandlerThread(DEFAULT_WORKER_NAME));
+ }
private final DeviceConfig.OnPropertiesChangedListener mPropertiesChangedListener =
this::updateProperties;
@@ -385,15 +388,7 @@
* @return instance of InteractionJankMonitor
*/
public static InteractionJankMonitor getInstance() {
- // 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;
+ return InstanceHolder.INSTANCE;
}
/**