`
rongxh2010
  • 浏览: 48791 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ThreadLocal原理

阅读更多

ThreadLocal是什么?看Java源码中的描述:

 

This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID).

 

ThreadLocal通过ThreadLocalMap与当前线程绑定到一起(如下图)。

 

 

每一个Thread对象,专门用一个ThreadLocalMap来存储自己专用的变量。ThreadLocalMap其实就跟我们平时常用的HashMap类似,能够存储Key-Value形式的数据。在这里,ThreadLocalMap的Key是一个ThreadLocal对象。

 

ThreadLocal在每次get或set操作时,都会先通过Thread.currentThread()方法来获取当前线程,再从当前线程中获取ThreadLocalMap。表面上看,ThreadLocal像是一个变量体(或者说是存储变量的容器),而实际上,它是通过Map来存储的。

 

一个ThreadLocal对象可以是多线程共享,但一个ThreadLocalMap对象却是某个线程独享的,即每一个Thread对象,都会创建一个自己专用的ThreadLocalMap,与其他Thread对象创建的ThreadLocalMap不存在相等关系。

 

当多个Thread对象共同访问同一个ThreadLocal对象时,threadLocal只是作为ThreadLocalMap的Key存在,而不作为变量的存储介质。threadLocal的set()方法和get()方法所涉及的value是存储为ThreadLocalMap的value。而ThreadLocalMap是每一个Thread各自专用的,互不相等的。这就是为什么同ThreadLocal被多线程同时访问,ThreadLocal的值却互不干扰的原理。

 

贴一下ThreadLocal的get()、set()、remove()方法的代码,从代码中看,更容易理解!

 

    /**
     * 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)
                return (T)e.value;
        }
        return setInitialValue();
    }

    /**
     * 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);
    }

    /**
     * Removes the current thread's value for this thread-local
     * variable.  If this thread-local variable is subsequently
     * {@linkplain #get read} by the current thread, its value will be
     * reinitialized by invoking its {@link #initialValue} method,
     * unless its value is {@linkplain #set set} by the current thread
     * in the interim.  This may result in multiple invocations of the
     * <tt>initialValue</tt> method in the current thread.
     *
     * @since 1.5
     */
     public void remove() {
         ThreadLocalMap m = getMap(Thread.currentThread());
         if (m != null)
             m.remove(this);
     }

 

 

  • 大小: 31.7 KB
分享到:
评论

相关推荐

    ThreadLocal原理及在多层架构中的应用.pdf

    首先,ThreadLocal原理是基于每个线程创建一个私有的数据存储结构(ThreadLocalMap),使得线程可以拥有自己独立的数据副本,而不会与其他线程共享。这意味着,即使多个线程访问相同的变量,它们也各自拥有这个变量...

    ThreadLocal原理分析图,visio软件打开

    ThreadLocal原理分析图,visio软件打开

    ThreadLocal原理及在多层架构中的应用

    ThreadLocal的工作原理主要基于以下几点: - **内部类ThreadLocalMap**:ThreadLocal在每个线程内部维护了一个名为ThreadLocalMap的哈希映射表,这个表的键是ThreadLocal对象,值是线程局部变量的实际值。这样,每...

    ThreadLocal应用示例及理解

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

    ThreadLocal原理及内存泄漏原因

    让我们深入理解ThreadLocal的工作原理以及可能导致内存泄漏的原因。 首先,ThreadLocal是如何实现每个线程都有独立变量副本的呢?这主要得益于内部类`ThreadLocalMap`。当一个ThreadLocal对象被创建后,它并没有...

    threadLocal

    以上内容涵盖了从ThreadLocal原理到其在实际开发中的应用,以及相关的多线程、并发编程、HTTP通信等知识点。通过阅读和理解这些资料,开发者可以深化对ThreadLocal的理解,并将其有效地应用于项目中。

    美团面试,问了ThreadLocal原理,这个回答让我通过了

    ThreadLocal的工作原理主要依赖于内部类`ThreadLocalMap`。每个`Thread`对象都有一个`ThreadLocalMap`实例,用于存储线程局部变量。`ThreadLocalMap`是一个特定于线程的数据结构,它的键是`ThreadLocal`对象本身,值...

    ThreadLocal的原理,源码深度分析及使用.docx

    ThreadLocal 的原理、源码深度分析及使用 ThreadLocal 是 Java 语言中的一种机制,用于实现线程本地存储,能够帮助开发者在多线程环境下解决变量访问安全的问题。下面将对 ThreadLocal 的原理、实现机制、使用方法...

    ThreadLocal

    在Java中,ThreadLocal的工作原理是为每个线程创建一个单独的存储空间,每个线程可以独立地读写这个变量,而不会影响其他线程。当我们创建一个新的ThreadLocal实例时,它并不会立即分配内存,而是等到线程第一次调用...

    Java进阶教程,面试大全,包罗万象

    Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的...ThreadLocal原理,用的时候需要注意什么。 CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。

    Java进阶教程,面试大全

    Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的...ThreadLocal原理,用的时候需要注意什么。 CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。

    深入理解 Java 之 ThreadLocal 工作原理1

    ThreadLocal是Java中用于线程局部变量的一个工具类,它的工作原理主要体现在如何在不同的线程之间隔离变量的副本,确保每个线程拥有自己的独立数据。这个设计模式在多线程编程中尤其有用,因为它避免了传统的同步...

    Android常见原理性面试专题.pdf

    3. **ThreadLocal原理** ThreadLocal是一个线程局部变量,每个线程都有自己独立的副本,互不干扰。它通过内部的ThreadLocalMap存储各个线程的变量副本,保证了线程安全。 4. **单线程模型中Message、Handler、...

    Android常见原理性面试专题.docx

    3. **ThreadLocal原理** ThreadLocal是线程局部变量,它为每个线程创建了一个独立的变量副本,每个线程只能访问自己的副本,互不影响。这样实现了线程间的隔离,确保了数据的安全性。 4. **Message、Handler、...

    ThreadLocal 内存泄露的实例分析1

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

    java 简单的ThreadLocal示例

    因此,理解ThreadLocal的工作原理并谨慎使用是非常重要的。 在提供的"ThreadLocal示例"压缩包中,可能包含了一些具体的代码示例,展示如何在实际项目中运用ThreadLocal。通过查看这些示例,你可以更深入地理解...

Global site tag (gtag.js) - Google Analytics