ThreadLocal 简单分析

 

   ThreadLocal<T> 是一个泛型类

   protected T initialValue() {   return null;  }// 用于初始化 

   private final ThreadLocal<Map<Object, Object>> store;

    public ThreadLocalCache(URL url) {
        this.store = new ThreadLocal<Map<Object, Object>>() {
            @Override
            protected Map<Object, Object> initialValue() {
                return new HashMap<Object, Object>();
            }
        };
    }

 

  ThreadLocal 里面有一个ThreadLocalMap class,这个Map通过 Thread的 threadLocalHashCode和nextHashCode 值算出 hashCode 

 

  Thread存储一个字段:保存了ThreadLocalMap 

   t.threadLocals = new ThreadLocalMap(this, firstValue);  // this = ThreadLocal实例

   

   ThreadLocalMap 取值判断

   private Entry getEntry(ThreadLocal key) {
            int i = key.threadLocalHashCode & (table.length - 1);
            Entry e = table[i];
            if (e != null && e.get() == key) // 不同的ThreadLocal 即使hashCode一样 也不会取到相同的值   
               return e;
            else 
                return getEntryAfterMiss(key,i,e); 

 

    ThreadLocal的remove get set 其实就是对Thread实例的字段操作

 

 附: 别人的代码  

public class ThreadLocalCache implements Cache {

    private final ThreadLocal<Map<Object, Object>> store;

    public ThreadLocalCache(URL url) {
        this.store = new ThreadLocal<Map<Object, Object>>() {
            @Override
            protected Map<Object, Object> initialValue() {
                return new HashMap<Object, Object>();
            }
        };
    }

    public void put(Object key, Object value) {
        store.get().put(key, value);
    }

    public Object get(Object key) {
        return store.get().get(key);
    }

}

 

 

 

 

你可能感兴趣的:(java,thread)