`
dwljd
  • 浏览: 6090 次
  • 性别: Icon_minigender_1
  • 来自: 福建
最近访客 更多访客>>
社区版块
存档分类
最新评论

ThreadLocal原理解析

    博客分类:
  • Java
阅读更多

    ThreadLocal即线程本地变量,通过ThreadLocal.set()设置到线程中的对象是线程自己的对象,其他线程是不需要访问、也访问不到的。各个线程中访问的是不同的对象。

 

     线程类Thread持有一个ThreadLocal.ThreadLocalMap的引用,通过这个map线程可以拥有多对本地变量;且各个线程拥有的是不同的map不需要同步,所以速度很快。

    /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals

   

     ThreadLocalMap的key是ThreadLocal实例。将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象,避免了将这个对象作为参数传递的麻烦。要保持多个不同对象的引用,就要多个ThreadLocale实例。

 

        /**
         * Construct a new map initially containing (firstKey, firstValue).
         * ThreadLocalMaps are constructed lazily, so we only create
         * one when we have at least one entry to put in it.
         */
        ThreadLocalMap(ThreadLocal firstKey, Object firstValue) {
            table = new Entry[INITIAL_CAPACITY];
            int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
            table[i] = new Entry(firstKey, firstValue);
            size = 1;
            setThreshold(INITIAL_CAPACITY);
        }

 

    ThreadLocal的get、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);
    }

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

    /**
     * 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
     * @param map the map to store.
     */
    void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

 

 

分享到:
评论

相关推荐

    正确理解ThreadLocal.pdf

    ### 正确理解ThreadLocal:深入解析其工作原理与应用场景 #### 一、ThreadLocal的基本概念 `ThreadLocal`是Java平台提供的一种线程局部变量的解决方案,它为每一个使用该变量的线程都提供了独立的变量副本,使得每...

    threadLocal

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

    使用ThreadLocal管理“session”数据

    要深入理解ThreadLocal的工作原理,需要查看其源码。ThreadLocal内部使用了一个ThreadLocalMap,它是一个基于ThreadLocal实例作为键,值为用户存储对象的弱引用表。每个线程都有一个这样的ThreadLocalMap,保证了...

    Android 详解ThreadLocal及InheritableThreadLocal

    本文将深入解析这两个概念以及它们在Android环境下的工作原理。 **ThreadLocal** 是一个线程局部变量,它为每个线程提供独立的副本。这意味着每个线程都拥有ThreadLocal变量的私有实例,它们之间互不干扰。在...

    Java源码解析ThreadLocal及使用场景

    Java源码解析ThreadLocal及使用场景 ThreadLocal是Java中一个非常重要的类,它在多线程环境下经常使用,用于提供线程本地变量。这些变量使每个线程都有自己的一份拷贝,使得多个线程可以独立地使用变量,不会彼此...

    ThreadLocal详解

    #### 重要概念解析:ThreadLocal在Java多线程中的角色 ThreadLocal是Java语言中处理多线程编程中线程安全问题的一种有效策略,它首次出现在JDK1.2版本中。与传统的使用`synchronized`关键字或`Lock`接口来实现线程...

    InheritableThreadLocal & ThreadLocal

    《InheritableThreadLocal & ThreadLocal 深度解析》 在Java编程中,线程局部变量(ThreadLocal)和可继承线程局部变量(InheritableThreadLocal)是两种非常重要的工具,它们允许我们在多线程环境中创建独立于线程...

    JAVA并发-自问自答学ThreadLocal.pdf

    1. **ThreadLocal的工作原理**: - 每个ThreadLocal实例都会为每一个线程创建一个单独的变量副本。当线程访问ThreadLocal的get()或set()方法时,实际上是访问的是与当前线程绑定的副本,而不是全局唯一的变量。 - ...

    java ThreadLocal使用案例详解

    ThreadLocal的工作原理 那么,ThreadLocal是如何工作的呢?当我们使用ThreadLocal时,实际上是将变量存储在ThreadLocalMap中。每个线程都可以拥有自己的ThreadLocalMap,从而避免了共享变量的线程安全问题。 ...

    Android 中ThreadLocal的深入理解

    ThreadLocal在Android开发中是一个非常重要的工具类,用于在多线程环境中提供线程局部变量。它的核心概念在于,每个...了解ThreadLocal的工作原理和使用场景,可以帮助开发者更好地管理和优化多线程环境中的数据存储。

    Java并发编程原理与实战

    Condition的使用及原理解析.mp4 使用Condition重写waitnotify案例并实现一个有界队列.mp4 深入解析Condition源码.mp4 实战:简易数据连接池.mp4 线程之间通信之join应用与实现原理剖析.mp4 ThreadLocal 使用及实现...

    Python threading.local代码实例及原理解析

    # 创建全局ThreadLocal对象 localVal = threading.local() # 在主线程中初始化 localVal.val = "Main-Thread" def process_student(): print(f'{localVal.val} (in {threading.current_thread().name})') def ...

    苍穹外卖-共享当前登录用户ID.docx

    #### 五、实现原理 1. **ThreadLocal的特性** `ThreadLocal`允许每个线程拥有一个独立的变量副本,这些副本互不影响。因此,即使不同的线程同时访问同一个`ThreadLocal`变量,它们也会看到不同的值。 2. **数据...

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

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

    龙果 java并发编程原理实战

    第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟...

    线程同步解析

    本文将深入探讨线程同步的基本原理、Java中的线程同步机制,特别是`synchronized`关键字和`ThreadLocal`类的应用,以及它们在解决线程安全问题上的作用。 ### 线程同步的重要性 在多线程环境中,当多个线程尝试...

    【电子版】校招面试题库(附答案与解析)java篇.zip

    2. 多线程:线程的创建、同步、死锁,以及ThreadLocal原理。 3. 集合框架:ArrayList、LinkedList、HashMap、HashSet的实现与区别。 4. 泛型:泛型的基本概念、类型擦除、通配符等。 5. IO/NIO:输入输出流体系,非...

    Java 并发编程原理与实战视频

    第31节Condition的使用及原理解析00:17:40分钟 | 第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟...

Global site tag (gtag.js) - Google Analytics