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