• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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