ThreadLocal源码分析
2017-12-19 15:52
211 查看
一 TheadLocal是什么?
ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。二 TheadLocal实现原理
以前的理解是:ThreadLocal类里面有一个ThreadLocalMap类,这个map以线程为key,存储所需的变量。大错正确的理解:Thread实例里面有一个ThreadLocalMap变量,这个map以TheadLocal为key,存储所需的变量。
详细的表达:ThreadLocalMap是ThreadLocal类的一个静态内部类,它实现了键值对的设置和获取(对比Map对象来理解),每个线程中都有一个独立的ThreadLocalMap副本,它所存储的值,只能被当前线程读取和修改。ThreadLocal类通过操作每一个线程特有的ThreadLocalMap副本,从而实现了变量访问在不同线程中的隔离。因为每个线程的变量都是自己特有的,完全不会有并发错误。还有一点就是,ThreadLocalMap存储的键值对中的键是this对象指向的ThreadLocal对象,而值就是你所设置的对象了。
三 源码分析
先看看set()方法:/** * Sets the current thread's copy of this thread-local variable * to the specified value. Most subclasses will have no need to * override this method, relying solely on the {@link #initialValue} * method to set the values of thread-locals. * * @param value the value to be stored in the current thread's copy of * this thread-local. */ public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
在看看最主要的 getMap()以及createMap()
/** * Get the map associated with a ThreadLocal. Overridden in * InheritableThreadLocal. * * @param t the current thread * @return the map */ ThreadLocalMap getMap(Thread t) { return t.threadLocals; } /** * Create the map associated with a ThreadLocal. Overridden in * InheritableThreadLocal. * * @param t the current thread * @param firstValue value for the initial entry of the map */ void createMap(Thread t, T firstValue) { t.threadLocals = new ThreadLocalMap(this, firstValue); }
在看看get()方法
/** * Returns the value in the current thread's copy of this * thread-local variable. If the variable has no value for the * current thread, it is first initialized to the value returned * by an invocation of the {@link #initialValue} method. * * @return the current thread's value of this thread-local */ 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(); } /** * Variant of set() to establish initialValue. Used instead * of set() in case user has overridden the set() method. * * @return the initial value */ private T setInitialValue() { T value = initialValue(); // 方法内直接return null Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); return value; }
然后就是最重要的ThreadLocalMap(看注释就理解了)
/** * ThreadLocalMap is a customized hash map suitable only for * maintaining thread local values. No operations are exported * outside of the ThreadLocal class. The class is package private to * allow declaration of fields in class Thread. To help deal with * very large and long-lived usages, the hash table entries use * WeakReferences for keys. However, since reference queues are not * used, stale entries are guaranteed to be removed only when * the table starts running out of space. */ static class ThreadLocalMap { /** * The entries in this hash map extend WeakReference, using * its main ref field as the key (which is always a * ThreadLocal object). Note that null keys (i.e. entry.get() * == null) mean that the key is no longer referenced, so the * entry can be expunged from table. Such entries are referred to * as "stale entries" in the code that follows. */ static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } }***********
四 总结
线程私有方式提供了解决并发问题的思路相关文章推荐
- ThreadLocal原理与源码分析
- ThreadLocal的研究_源码分析
- ThreadLocal 从源码角度简单分析
- ThreadLocal的源码分析和理解
- ThreadLocal源码分析:(三)remove()方法
- Java并发编程系列(六)---- ThreadLocal使用及源码分析
- ThreadLocal应用场景以及源码分析
- ThreadLocal 及InheritableThreadLocal 源码分析
- [Java多线程]-ThreadLocal源码及原理的深入分析
- ThreadLocal源码分析
- android-----ThreadLocal源码分析
- 02_ThreadLocal语法与源码分析
- 分析balde源码,查看Web工程处理Ioc注入的背后的过程,ThreadLocal 使用保存线程所有的request and respond,
- ThreadLocal源码分析和应用
- ThreadLocal源码分析:(二)get()方法
- 从源码来分析ThreadLocal、Message、Handler、Looper、MessageQueue
- ThreadLocal使用和源码分析
- ThreadLocal源码分析
- ThreadLocal分析--部分源码
- ThreadLocal从源码分析总结到内存泄漏