`

我对ThreadLocal的理解

阅读更多
http://javarecipes.com/2012/07/11/understanding-the-concept-behind-threadlocal/
http://blog.csdn.net/qjyong/article/details/2158097

这两篇文章都认为ThreadLocal的实现原理说到底是一个Map<Thread currentThread, Object value>:
 
public class CustomThreadLocal {
 
    private static Map threadMap = new HashMap();
 
    public static void add(Object object) {
        threadMap.put(Thread.currentThread(), object);
    }
 
    public static void remove(Object object) {
        threadMap.remove(Thread.currentThread());
    }
 
    public static Object get() {
        return threadMap.get(Thread.currentThread());
    }
 
}


我认为, 这个观点只有一半是正确的。
ThreadLocal确实是通过Map来实现,但这个Map的key并不是Thread.curentThread,而是ThreadLocal的实例本身。

简单地说,ThreadLocal的关键的地方在下面两点:
1.同一线程内,把某值(假设为someValue)存储在ThreadLocal内,那么可以在本线程内的任意其他地方、任意其他时间获得这个值
2.对于其他线程来说,第1点里面的someValue是不可见的

这是怎么做到的呢?
这是通过“每一个线程,都持有一个ThreadLocal.ThreadLocalMap的实例”来实现的。

查看Thread源码,Thread有一个实例域:
ThreadLocal.ThreadLocalMap threadLocals = null;
而ThreadLocal.ThreadLocalMap就是一个Map。

查看ThreadLocal.ThreadLocalMap,发现它的key就是当前的ThreadLocal:
ThreadLocal.ThreadLocalMap的set方法:
private void set(ThreadLocal key, Object value) {
	/*......*/
}


再返回去看看ThreadLocal的set方法:
     public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }


可以清晰地看到,ThreadLocal.ThreadLocalMap的key就是this,也就是当前的ThreadLocal


举例:
class MyThreadLocalA {
    private static final ThreadLocal threadLocalInstanceA = new ThreadLocal();
    
    public static Object get() {
        return threadLocalInstanceA.get();
    }
    /*.....*/
}

class MyThreadLocalB {
    private static final ThreadLocal threadLocalInstanceB = new ThreadLocal();
    public static Object get() {
        return threadLocalInstanceB.get();
    }
    /*.....*/
}


假设有两个线程,分别是threadX和threadY
假设threadX访问MyThreadLocalA时,放入值"X_A",访问MyThreadLocalB时放入值"X_B"
假设threadY访问MyThreadLocalA时,放入值"Y_A",访问MyThreadLocalB时放入值"Y_B"

那么
threadX.threadLocals(我们称之为xMap)会是这样:
key 													value
---------------------------------------------
threadLocalInstanceA							X_A
threadLocalInstanceB							X_B


threadY.threadLocals(我们称之为yMap)会是这样:
key 													value
---------------------------------------------
threadLocalInstanceA							Y_A
threadLocalInstanceB							Y_B


那么在线程threadX内执行MyThreadLocalA.get(),得到的值就会是"X_A"。
具体流程:
MyThreadLocalA.get()
-->threadLocalInstanceA.get()
	 -->Thread.currentThread.threadLocals(也就是xMap)
		  -->xMap.getEntry(this)(这里的this就是threadLocalInstanceA)
			   -->得到"X_A"


其实过程很清晰。别人说的再多,还不如自己去看看源代码~   
分享到:
评论

相关推荐

    理解ThreadLocal

    理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal

    ThreadLocal应用示例及理解

    ### 理解ThreadLocal原理 ThreadLocal内部通过一个ThreadLocalMap来存储每个线程的副本。这个Map的键是ThreadLocal实例,值是线程的局部变量。每个线程都有自己的ThreadLocalMap,存储在Thread类的成员变量中。 ##...

    JDK的ThreadLocal理解(一)使用和测试

    **标题:“JDK的ThreadLocal理解(一)使用和测试”** **正文:** ThreadLocal是Java中的一个非常重要的线程安全工具类,它在多线程编程中扮演着独特的角色。通过创建ThreadLocal实例,我们可以为每个线程提供一个...

    正确理解ThreadLocal.pdf

    `ThreadLocal`是一种强大的工具,它简化了多线程编程中对线程局部数据的管理,提高了代码的可读性和可维护性。然而,不当的使用也可能导致内存泄漏和其他潜在问题。因此,在使用`ThreadLocal`时,应当充分理解其工作...

    ThreadLocal

    在使用ThreadLocal时,理解其工作原理和限制是非常重要的。合理的使用能够帮助我们编写出更高效、更易于维护的多线程程序,但也要避免滥用,因为它可能会引入难以察觉的并发问题和内存管理问题。

    理解threadlocal

    在JDK 5.0中,`ThreadLocal`还增加了对泛型的支持,这使得类型安全性和可读性得到了显著提高。泛型版本的方法如下: - `void set(T value)` - `T get()` - `T initialValue()` #### 四、ThreadLocal的简单实现示例...

    ThreadLocal的简单理解.doc

    下面是对 ThreadLocal 的简单理解。 一、背景 最近有人问我 ThreadLocal 是如何做到在每个线程中的值都是隔离的,于是写下这篇文章来简单记录下。 二、ThreadLocal 解决的问题 ThreadLocal 解决了一个重要的问题...

    ThreadLocal深度理解

    ThreadLocal深度理解

    threadLocal

    1. 多线程:理解ThreadLocal的使用必须建立在对多线程的理解基础上,包括线程的创建、执行、同步机制等。 2. 并发编程:ThreadLocal是解决并发问题的一种策略,它提供了一种避免共享状态的方式,减少了锁的使用。 3....

    ThreadLocal 内存泄露的实例分析1

    at 中专门为每一个 web 应用...理解 `ThreadLocal` 的工作原理以及它如何与类加载器交互,是避免此类问题的关键。在实际开发中,应当养成良好的编程习惯,如使用后及时清理 `ThreadLocal` 变量,以防止内存资源的浪费。

    java 简单的ThreadLocal示例

    - 当你对ThreadLocal进行`set()`操作时,实际上是将值放入了当前线程的ThreadLocalMap中,键是ThreadLocal对象本身,值是你设置的对象。 - 当你调用`get()`时,它会查找当前线程的ThreadLocalMap,找到对应的键(即...

    彻底理解ThreadLocal 1

    ThreadLocal是Java中用于线程局部变量的一个工具类,它允许在多线程环境下为每个线程创建独立的变量副本,从而避免了线程之间的数据...理解ThreadLocal的工作原理和使用方法,对于编写高效、安全的并发程序至关重要。

    java事务 - threadlocal

    Java事务和ThreadLocal是两种在Java编程中至关重要的概念,它们分别用于处理多线程环境下的数据一致性问题和提供线程局部变量。 首先,我们来深入理解Java事务。在数据库操作中,事务是一系列操作的集合,这些操作...

    ThreadLocal的几种误区

    然而,ThreadLocal在理解和使用过程中容易产生一些误区,这里我们将详细探讨这些常见的误解。 误区一:ThreadLocal是Java线程的一个实现 ThreadLocal并非Java线程的实现,它只是一个工具类,用于创建线程局部变量。...

    设计模式及ThreadLocal资料

    代理模式为其他对象提供一种代理以控制对这个对象的访问。在Java中,代理模式常用于动态代理,允许在运行时为对象绑定额外的行为,如AOP(面向切面编程)中的事务管理。 然后,我们转向ThreadLocal。ThreadLocal是...

    使用ThreadLocal管理“session”数据

    在实际开发中,有些框架如Spring已经内置了对ThreadLocal的管理和清理机制,可以更方便地在多线程环境中使用session。 总结,ThreadLocal是Java中处理线程局部数据的利器,特别适用于需要线程隔离的场景,如Web...

Global site tag (gtag.js) - Google Analytics