xref: /aosp_15_r20/external/robolectric/utils/src/main/java/org/robolectric/util/SoftThreadLocal.java (revision e6ba16074e6af37d123cb567d575f496bf0a58ee)
1 package org.robolectric.util;
2 
3 import java.lang.ref.SoftReference;
4 
5 /**
6  * Soft reference to a {@code java.lang.ThreadLocal}.
7  *
8  * @param <T> The referent to track.
9  */
10 public abstract class SoftThreadLocal<T> {
11 
12   @SuppressWarnings({"AndroidJdkLibsChecker", "NewApi"})
13   private final ThreadLocal<SoftReference<T>> threadLocal =
14       ThreadLocal.withInitial(() -> new SoftReference<>(create()));
15 
get()16   public synchronized T get() {
17     T item = threadLocal.get().get();
18     if (item == null) {
19       item = create();
20       threadLocal.set(new SoftReference<>(item));
21     }
22     return item;
23   }
24 
set(T item)25   public void set(T item) {
26     threadLocal.set(new SoftReference<>(item));
27   }
28 
create()29   protected abstract T create();
30 }
31