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 private final ThreadLocal<SoftReference<T>> threadLocal = new ThreadLocal<SoftReference<T>>() { 12 @Override protected SoftReference<T> initialValue() { 13 return new SoftReference<>(create()); 14 } 15 }; 16 get()17 synchronized public T get() { 18 T item = threadLocal.get().get(); 19 if (item == null) { 20 item = create(); 21 threadLocal.set(new SoftReference<>(item)); 22 } 23 return item; 24 } 25 set(T item)26 public void set(T item) { 27 threadLocal.set(new SoftReference<>(item)); 28 } 29 create()30 abstract protected T create(); 31 } 32