ThreadLocal设计
  • 最初设计是在ThreadLocal对象中维护一个Map,以线程号为key,实现多线程属性的隔离。后面改为在Thread中维护Map,以ThreadLocal对象为键。此种实现的优点:
  1. 线程销毁后,维护的Map自动释放(GC)。
  2. Map的大小变为ThreadLocal对象的个数,高并发情况下Map大小明显减少,提高了效率。
  3. 实现了通过ThreadLocal隔离属性的完全隔离。
  • get代码
  1. public T get() {
  2. Thread t = Thread.currentThread();
  3. ThreadLocalMap map = getMap(t);
  4. if (map != null) {
  5. ThreadLocalMap.Entry e = map.getEntry(this);
  6. if (e != null) {
  7. @SuppressWarnings("unchecked")
  8. T result = (T)e.value;
  9. return result;
  10. }
  11. }
  12. return setInitialValue();
  13. }
  • getMap(t)代码
ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }
  • Thread代码
ThreadLocal.ThreadLocalMap threadLocals = null;