本文共 2929 字,大约阅读时间需要 9 分钟。
private final int threadLocalHashCode = nextHashCode();
public void set(T value) { // 获取当前线程 Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else // map为空则创建 createMap(t, value); } // thread 中保存实例成员变量tl ThreadLocalMap getMap(Thread t) { return t.threadLocals; } void createMap(Thread t, T firstValue) { t.threadLocals = new ThreadLocalMap(this, firstValue); }
private static int nextIndex(int i, int len) { return ((i + 1 < len) ? i + 1 : 0); }
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } return setInitialValue(); }
public void remove() { // 获取当前线程维护的threadlocalmap ThreadLocalMap m = getMap(Thread.currentThread()); if (m != null) m.remove(this); } private void remove(ThreadLocal key) { Entry[] tab = table; int len = tab.length; int i = key.threadLocalHashCode & (len-1); for (Entry e = tab[i]; e != null; e = tab[i = nextIndex(i, len)]) { if (e.get() == key) { e.clear(); // remove的时候同样也会调用expungeStaleEntry方法执行清理工作 expungeStaleEntry(i); return; } } }
转载地址:http://whiii.baihongyu.com/