You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
android-notes/blogs/Android/Framework/Interview/技巧心得相关/说说 ThreadLocal 的原理.md

1.9 KiB

说说 ThreadLocal 的原理
  1. ThreadLocal 的适用于什么场景?
  2. ThreadLocal 的使用方式是怎样的?
  3. ThreadLocal 的实现原理怎样的?
private static void prepare(boolean quitAllowed){
    sThreadLocal.set(new Looper(quitAllowed));
}
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
public static Looper myLooper(){
    return sThreadLocal.get();
}
private static final ThreadLocal<Choreographer> sThreadInstance = new ThreadLocal<Choreographer>(){
    @Override
    protected Choreographer initialValue(){
        Looper looper = Looper.myLooper();
        return new Choreographer(looper);
    }
}
public static Choreographer myLooper(){
    return sThreadLocal.get();
}
public T get(){
    Thread currentThread = Thread.currentThread();
    Values values = values(currentThread);
    if(values!=null){
        Object[] table = values.table;
        int index = hash & values.mask;
        if(this.reference == table[index]){
            return (T)table[index + 1];
        }else{
            values = initializeValues(currentThread);
        }
    }
    return (T)values.getAfterMiss(this);
}
Object getAfterMiss(ThreadLocal<?> key){
    Object[] table = this.table;
    int index = key.hash & mask;
    Object value = key.initialVaule();
    table[index] = key.reference;
    table[index + 1] = value;
    size++;
    cleanUp();
    return value;
}

public void set(T value){
    Thread currentThread = Thread.currentThread();
    Values values = values(currentThread);
    if(values == null){
        values = initalizeValues(currentThread);
    }
    values.put(this, value);
}

总结

  1. 同一个 ThreadLocal 对象,在不同线程 get 返回不同的 value
  2. Thread 对象里有张表,保存 ThreadLocal 到 value 的映射关系
  3. 这张表是怎么实现的?
  4. 是如何解决 hash 冲突的?