package org.robolectric.util;
import java.lang.ref.SoftReference;
/**
* Soft reference to a {@code java.lang.ThreadLocal}.
*
* @param <T> The referent to track.
*/
public abstract class SoftThreadLocal<T> {
private final ThreadLocal<SoftReference<T>> threadLocal = new ThreadLocal<SoftReference<T>>() {
protected SoftReference<T> initialValue() {
return new SoftReference<>(create());
}
};
synchronized public T get() {
T item = threadLocal.get().get();
if (item == null) {
item = create();
threadLocal.set(new SoftReference<>(item));
}
return item;
}
public void set(T item) {
threadLocal.set(new SoftReference<>(item));
}
abstract protected T create();
}