ThreadLocal<T>学习总结

public class ThreadLocalTest {

    /**
     * @param
     * @Author: xdj
     * @Date: 2019/4/12 10:16
     * @Description:
     * @return: void
     * ThreadLocal是一种变量类型,我们称之为“线程局部变量”
     * 每个线程访问这种变量的时候都会创建该变量的副本,这个变量副本为线程私有
     * ThreadLocal类型的变量一般用private static加以修饰
     */
    @Test
    public void test() {

         ThreadLocal threadLocal = new ThreadLocal(){
             @Override
             protected Object initialValue() {
                 return Thread.currentThread().getId();
             }
         };

//        threadLocal.set("测试threadLocal");

        System.out.println(threadLocal.get());

    }
}

学习ThreadLocal<T>,首先先从它的数据结构开始,ThreadLocal的内部类ThreadLocalMap

// 只是截取部分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;
            }
        }

而ThreadLocalMap又存储在Thread中。

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

ThreadLocal中的几个重要方法,提供了重要的操作

get方法

这里通过getMap方法获取当前线程中的所有ThreadLocal<T>记录threadLocals,先判断是否已有值,如果没有则调用setInitialvalue()赋值

set()方法

                  

先判断是否有值了,如果有则覆盖,没有则创建新的Map对象。

remove方法

                  

总结:Thread通过ThreadLocalMap来存储线程中的变量,第一次获取时需要先通过set()将值保存进map中。通过泛型来区分给个变量的key。

参考:

  https://www.cnblogs.com/dolphin0520/p/3920407.html

原文地址:https://www.cnblogs.com/angleshoot/p/10696686.html

时间: 2024-08-12 09:06:39

ThreadLocal<T>学习总结的相关文章

ThreadLocal类学习笔记

这个类在java1.2中就出现了,线程独有的变量(每个线程都有一份变量),使用它的好处之一就是可以少传许多参数. 在哪里用到它呢?有连接池的地方就有它的身影,连接池包括数据库连接池,网络连接池等. import java.util.UUID; class Factory { static ThreadLocal<String> connection=new ThreadLocal<>(); static String getConnection() { String s=conne

ThreadLocal的学习

ThreadContext<T>为基于键/值对的当前线程提供了一种绑定和非绑定对象的方法. 这个类提供线程局部变量.这些变量与普通的变量不同,因为每个访问一个线程的线程(通过其get或set方法)都有自己的独立初始化变量的副本. ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段(例如:一个用户ID或事务ID).每个线程都对线程本地变量的副本有一个隐式引用, 只要线程还活着,ThreadLocal实例就可以访问;在一个线程消失之后,所有线程本地实例的副本都将被垃圾收集(除

finalize()和四种引用的一点思考

一次对ThreadLocal的学习引发的思考 ThreadLocal对Entry的引用是弱引用,于是联想到四种引用的生命周期. 强引用,不会进行垃圾回收 软引用,JVM内存不够,进行回收 弱引用,下次GC,直接进行回收 虚引用,不会对GC产生任何影响,结合ReferenceQueue使用,只为引用被回收时收到通知. 所以如果只有弱引用指向ThreadLocal,那么下次GC,ThreadLocal将被回收.阿里的代码规范上也要求ThreadLocal要被static修饰,就是为了防止后续还要使用

2015年11月26日 Java基础系列(三)ThreadLocal类初级学习

序,ThreadLocal类是为了解决多线程的安全问题.线程安全的意思也就是说每个线程操作自己的变量,不要对其他线程的值造成影响. 在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性. 1 ThreadLocal解决多线程安全问题的思路是通过ThreadLocalMap进行管控,就像一个Map中存在多个键值对,ThreadLocalMap可以对比Map进行理解. 2 一般通过覆盖ThreadLocal的init

ThreadLocal源码学习

ThreadLocal,线程本地化对象,在多线程环境中,使用ThreadLocal对象来维护变量时,ThreadLocal为每个使用该变量的线程维护一个独立的线程副本. ThreadLocal.java源文件内容为: 1 /** 2 * ThreadLocal内部包含一个用数组实现的哈希表,用来存储对应到每个线程的局部对象的值 3 * 其中,ThreadLocal对象担当key,实际通过threadLocalHashCode值来进行检索 4 */ 5 public class ThreadLoc

Java学习笔记--ThreadLocal

我们知道Spring通过各种模板类降低了开发者使用各种数据持久技术的难度.这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突.我们使用模板类访问底层数据,根据持久化技术的不同,模板类需要绑定数据连接或会话的资源.但这些资源本身是非线程安全的,也就是说它们不能在同一时刻被多个线程共享.虽然模板类通过资源池获取数据连接或会话,但资源池本身解决的是数据连接或会话的缓存问题,并非数据连接或会话的线程安全问题. 按照传统经验,如果某个对象是非线程安全的,在多线程环境下,对对

[Java并发包学习七]解密ThreadLocal

概述 相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路:ThreadLocal的目的是为了解决多线程访问资源时的共享问题.如果你也这样认为的,那现在给你10秒钟,清空之前对ThreadLocal的错误的认知! 看看JDK中的源码是怎么写的: This class provides thread-local variables. These variables differ from their norm

JAVA学习篇--ThreadLocal,Java中特殊的线程绑定机制

在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个connection连接).那么ThreadLocal是如果做到的呢?它和同步锁的不同在哪里? 是什么: 对于ThreadLocal看英文单词我们很容易理解为一个线程的本地实现,但是它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLoc

Python学习笔记__10.3章 ThreadLocal

# 这是学习廖雪峰老师python教程的学习笔记 1.概览 在多线程环境下,每个线程都有自己的数据.一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁.但线程的局部变量,在函数调用时很麻烦 1)方式一:一层一层传 def process_student(name): std = Student(name)   # std是局部变量,但是每个函数都要用它,因此必须传进去: do_task_1(std) do_task_2(std)