ThreadLocal的三个小要点

730 阅读1分钟

1. Thread中存储的是ThreadLocalMap类型

2. ThreadLocal是以WeakPrefernce的形式存储在ThreaLocalMap中的

  static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }

3. ThreadLocal的get方法

  • getMap(this) -> (经过Map的一些算法)获取Entry->取得Entry的value
  • 如果取不到数据,会调用initialValue,其他类型通过override这个函数来初始化,比如
   private static final ThreadLocal<Choreographer> sSfThreadInstance =
            new ThreadLocal<Choreographer>() {
                @Override
                protected Choreographer initialValue() {
                    Looper looper = Looper.myLooper();
                    if (looper == null) {
                        throw new IllegalStateException("The current thread must have a looper!");
                    }
                    return new Choreographer(looper, VSYNC_SOURCE_SURFACE_FLINGER);
                }
            };