首页
学习
活动
专区
圈层
工具
发布

ThreadLocal 类

在 ThreadLocal类中有一个 Map,用于存储每一个线程变量的副本,Map中元素的键为线程对象,而值为对应线程的变量副本。ThreadLocal采用了 “以空间换时间” 的方式。...三、ThreadLocal 的实现原理 ---- 下面是 ThreadLocal的类图结构,从图中可知:Thread类中有两个变量 threadLocals和 inheritableThreadLocals...()); } } 五、InheritableThreadLocal 类 ---- 在上面说到的 ThreadLocal类是不能提供子线程访问父线程的本地变量的,而 InheritableThreadLocal...ThreadLocal类,并重写了childValue、getMap、createMap三个方法。...六、从 ThreadLocalMap看 ThreadLocal使用不当的内存泄漏问题 ---- 【1】基础概念 :首先我们先看看 ThreadLocalMap的类图,在前面的介绍中,我们知道 ThreadLocal

61830
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ThreadLocal类详解

    ThreadLocal类详解 一、概述 ThreadLocal类是Java提供的一种线程局部存储,它为每个使用该变量的线程提供一个独立的变量副本。...这意味着,每个线程可以访问自己内部的ThreadLocal变量,而不会和其他线程的ThreadLocal变量冲突。ThreadLocal实例通常被声明为private static类型。...ThreadLocal类提供了四个对外开放的接口方法,这也是用户操作ThreadLocal类的基本方法: void set(Object value):设置当前线程的线程局部变量的值。...其实在ThreadLocal类中有一个静态内部类ThreadLocalMap(其类似于Map),用键值对的形式存储每一个线程的变量副本,ThreadLocalMap中元素的key为当前ThreadLocal...当把threadLocal实例置为null以后,没有任何强引用指向threadLocal实例,所以threadLocal将会被gc回收。

    34810

    【连载 13】ThreadLocal 类

    java.lang.ThreadLocal可以不必提前确定线程的数量,不必提前分配每个线程所需要的对象,直接全局定义一个java.lang.ThreadLocal对象,在多线程编程中使用java.lang.ThreadLocal...首先我们看一下如何创建一个java.lang.ThreadLocal对象: ThreadLocal threadLocal = new ThreadLocal(); 创建方法需要声明泛型...,下面是ThreadLocal的无参构造方法: public ThreadLocal() { } 该方法获取到的独享对象默认值是null,如果你想设置其他默认值,可以使用以下语法: ThreadLocal...; } }; 亦或者使用java.lang.ThreadLocal#withInitial方法创建ThreadLocal对象: ThreadLocal threadLocal...如果ThreadLocal实例在某个类中定义为static,而该类又被类加载器加载,那么这个ThreadLocal对象将一直存在于内存中,直到线程结束或者手动调用remove()方法将其移除。

    15910

    ThreadLocal 类精讲

    ThreadLocal 概述 ThreadLocal 类在多线程中很常见,其主要的特性可以概括为以下三点: 具备向所有线程提供上下文的能力; 延迟创建线程上下文实例; 一个线程可以绑定多个 ThreadLocal...实例; 同一个 ThreadLocal 可以被多个线程同时绑定; ThreadLocal 是一个彻底的工具类,本身不存储任何上下文信息; 2....有上述图可见,ThreadLocal 是一个彻底的工具类,本身不存储任何上下文信息,不同 ThreadLocal 实例之间仅仅是泛型 T 不同,执行的逻辑是完全相同的。 6....InheritableThreadLocal 类 线程上下文可以利用 ThreadLocal 类实现。而线程中有一个概念:父线程和子线程。...() 实例,其仅仅重写了 ThreadLocal 类的 3 个方法。

    1.1K10

    理解Java里面ThreadLocal类

    关于ThreadLocal ThreadLocal类并不java并发包里面的一个类,而是java.lang包里面的一个使用频次并不是非常高的一个类,尽量它不在并发包里面,但它的设计用途却可以用来规避一些同步问题...ThreadLocal的常用方法 get(): 读取当前线程在ThreadLocal里面的变量数据,不同的线程看到的变量是隔离的 set(T value): 向当前线程中放入或修改变量数据 initialValue...### ThreadLocal例子 (1)线程计数器,每个线程内有自己的线程计数器,不需要加锁和同步 static final ThreadLocal counter=new ThreadLocal()...需要ThreadLocal并不是替换Java里面同步操作的,它的使用场景非常有限,在一定特定的情况下可以发挥比较棒的作用,比如在Spring和Hibernate框架中就大量采用了ThreadLocal来保存事务会话...总结 本文主要介绍了Java里面ThreadLocal类的作用,概念及使用场景和缺点,尽管在日常开发中这个类很少被使用,但其在特定的场景下可以非常巧妙的避免并发问题,比如在上一篇文章中,我们提到了Java

    67030

    深入JDK源码之ThreadLocal类

    ThreadLocal其实就是一个工具类,用来操作线程局部变量,ThreadLocal 实例通常是类中的 private static 字段。...API表达了下面几种观点: ThreadLocal不是线程,是线程的一个变量,你可以先简单理解为线程类的属性变量。 ThreadLocal 在类中通常定义为静态类变量。...ThreadLocal源码 ThreadLocal类本身定义了有get(), set()和initialValue()三个方法。...因此ThreadLocal实例的变量只有这个threadLocalHashCode,而且是final的,用来区分不同的ThreadLocal实例,ThreadLocal类主要是作为工具类来使用,那么ThreadLocal.set...ThreadLocalMap是定义在ThreadLocal类内部的私有类,它是采用“开放定址法”解决冲突的hashmap。key是ThreadLocal对象。

    83250

    ThreadLocal 类 的源码解析以及使用原理

    2、源码分析 1.ThreadLocal类封装了getMap()、Set()、Get()、Remove()4个核心方法。...,并提供一个类静态get方法用以获取当前线程ID。...ThreadLocalMap类是包私有的,允许在Thread类中声明字段。为了帮助处理非常大且长时间的使用,哈希表entry使用了对键的弱引用。有助于GC回收。...关于引用,预留飞机票 public void clear() { this.referent = null; } 1.3 功能测试 开启2个线程,每个个线程都使用类级别的threadLocal,...==》InheritableThreadLocal 2.1 源码注释: 这个类扩展ThreadLocal,以提供从父线程到子线程的值的继承:当创建子线程时,子线程会接收父元素所具有值的所有可继承线程局部变量的初始值

    77710

    一文带你读懂JDK源码:ThreadLocal类

    实现线程封闭的方法,就是今天的主角 -- ThreadLocal 类了;下面我们从4个角度剖析 ThreadLocal 类的源码:应用场景&功能、底层数据结构&源码、内存泄漏&规避手段 和 replaceStaleEntry...底层数据结构&源码 底层数据结构 ThreadLocal 比较特殊,它的内部并没有像 HashMap 等工具类那样自行维护一个存储数据的容器,而是提供了一个内部类定义给 Thread 类进行初始化引用,...这个内部类就是 ThreadLocalMap 类。...所以我们剖析 ThreadLocal 底层,就是结合 Thread 类去理解 ThreadLocalMap 这个内部类所提供的能力(而这个内部类同样内部嵌套了另外一个内部类,那就是 Entry 类,不着急...ThreadLocal 类对象和它所持有的值对象。

    34120

    muduo网络库学习之ThreadLocal 类、ThreadLocalSingleton类封装知识点

    一、ThreadLocal类 1、在单线程程序中,我们经常要用到"全局变量"以实现多个函数间共享数据。 2、在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共有。...ThreadLocal()   {     pthread_key_create(&pkey_, &ThreadLocal::destructor);   } 当某个线程运行结束,这个线程对应的实际数据...destructing 0x8507038 main one simba@ubuntu:~/Documents/build/debug/bin$  二、ThreadLocalSingleton类...其中instance() 的实现与Singleton 类的实现不同,因为这里是每个线程各有一个单例对象T,而不是所有线程共享一个。...Deleter类是用来实现当某个线程执行完毕,执行注册的destructor函数,进而delete t_value_ 。

    1.4K00

    Java中ThreadLocal类的作用以及实现原理

    类 它主要由四个方法组成initialValue(),get(),set(T),remove(),其中值得注意的是initialValue(),该方法是一个protected的方法,显然是为了子类重写而特意实现的...ThreadLocal中的确实实现直接返回一个null: 四、ThreadLocal的原理 ThreadLocal是如何做到为每一个线程维护变量的副本的呢?...其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。...初始化一个ThreadLocal对象,ThreadLocal有三个成员方法 get()、set()、initialvalue()。    ...使用方法二  当要给线程初始化一个特殊值时,需要自己实现ThreadLocal的子类并重写该方法,通常使用一个内部匿名类对       ThreadLocal进行子类化,EasyDBO中创建jdbc连接上下文就是这样做的

    45420

    ThreadLocal

    JDK8设计Key=ThreadLocal的好处 Thread类又个成员变量,如果是Key=Thread对象,那么我们一个线程ThreadLocalMap只能存储一个变量对象,如果是ThreaLocal...ThreadLocalMap 是ThreadLocal内部类,没有实现Map接口,是完全自己独立实现的。ThreadLocalMap是Thread类的成员变量。...ThreadLocal.ThreadLocalMap threadLocals = null; ThreadLocalMap内存溢出 Thread类有一个ThreadLocalMap成员变量。...该变量包含了一个Entry数组,该数组真正保存了ThreadLocal类set的数据。Entry是由threadLocal和value组成。...图片 ThreadLocal对象画到了堆上,其实在实际的业务场景中不一定在堆上。因为如果ThreadLocal被定义成了static的,ThreadLocal的对象是类共用的,可能出现在方法区。

    39820
    领券