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

ThreadLocal 源码分析

成员变量 & 核心类分析 // 计算hash值 private final int threadLocalHashCode = nextHashCode(); // 使用原子类记录hash值 private...内存泄漏的原因 通过对变量和核心类的分析,相信对 ThreadLocal 的一个结构有了大致的了解,接下来我们先来看下 ThreadLocal 的 map 是怎么定义的。...> k, Object v) { super(k); value = v; } } 回到问题 TOP 3 ,由此可以分析,在 gc 的情况下,k 会出现为 null...核心方法分析 3.1 set 数据 核心逻辑就是: 把数据放到当前线程的 ThreadLocalMap 的 value 如果当前 key 的位置已经有了就覆盖 如果当前位置的元素与当前 key 不相等,...= len; removed = true; // 清理无效的 entity // expungeStaleEntry我们前面也分析了

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

    ThreadLocal案例分析

    ThreadLocal简介 这篇博客主要对ThreadLocal类的基础知识和实践应用进行分析。文章的重点在于应用案例的探究,同时也会对理论基础作简单的介绍。...下面从init-service-destroy三个阶段分析下其生命周期: Init 第一次调用get方法的时候完成了初始化过程。...判断一个方案可不可行,必须要具体业务逻辑具体分析,在本例中,statistics是用于存储统计数据的对象,那么对FileSystem进行操作(比如:create、mkdir、list、delete等)的同时都会记录在...经过上面的各种案例分析,这个问题就灰常容 易解决了,只需要将Bean的生命周期与Thread同步就行。ThreadLocal正合适。...总结 上面小节中分别分析了ThreadLocal的两个主要的应用领域: 1.解决并发问题。 2.解决数据存储问题。

    59510

    深入分析ThreadLocal

    ThreadLocal是啥?以前面试别人时就喜欢问这个,有些伙伴喜欢把它和线程同步机制混为一谈,事实上ThreadLocal与线程同步无关。...ThreadLocal虽然提供了一种解决多线程环境下成员变量的问题,但是它并不是解决多线程共享变量的问题。那么ThreadLocal到底是什么呢?...是ThreadLocal包含在Thread中,而不是Thread包含在ThreadLocal中,有些小伙伴会弄错他们的关系。...ThreadLocal使用示例 示例如下: public class SeqCount { private static ThreadLocal seqCount = new ThreadLocal...ThreadLocal为什么会内存泄漏 前面提到每个Thread都有一个ThreadLocal.ThreadLocalMap的map,该map的key为ThreadLocal实例,它为一个弱引用,我们知道弱引用有利于

    41620

    大厂是怎么用ThreadLocal?ThreadLocal核心原理分析

    ThreadLocal的使用很简单,其中主要有三个方法set(obj) :设置需要存储的值get() :获取值remove() :移除值,此操作很有必要,否则会造成内存泄漏源码解读 对于ThreadLocal...接下来可以带着这些疑惑来来从源码角度分析。...核心源码Thread类 Thread类中维护ThreadLocal.ThreadLocalMap属性,用于存储多个当前线程独有的本地变量值; ThreadLocalMap属性的初始化是在调用ThreadLocal...{ ThreadLocal.ThreadLocalMap threadLocals = null;}ThreadLocal类 严格来讲,ThreadLocal类更像是一个工具类,使用它的set(...代码实现1 创建用于存储用户信息的ThreadLocal对象的上下文类public class ApiUserContext { // 创建存储用户信息的ThreadLocal对象 public

    39420

    自信,这是最好的ThreadLocal分析

    估计很多人都答不上来,因为没有真正去了解过,如果你不熟悉这块,不如趁这次机会弄懂 ThreadLocal。读完会让你对 ThreadLocal 印象深刻,丛容面对 ThreadLocal 相关问题。...ThreadLocal 内部结构 可以将 ThreadLocal 理解为一个容器,对外提供了 set/get 方法,用于保存/获取当前线程对应的 value,但是 ThreadLocal 并不是真正的容器...ThreadLocal 方法详解 ThreadLocal 中核心的就是set,get 方法,分别来看下实现。...key 固定只能为 ThreadLocal 的类型,这样就失去的拓展的功能,从而要想实现自动 GC,就必须在内部再给 ThreadLocal 包一层弱引用。...可能会有这样的疑问,ThreadLocal 不是提供了remove 方法么,ThreadLocal 对象不再使用时,主动 remove,不就不会存在问题了?

    66520

    ThreadLocal的使用及原理分析

    什么是ThreadLocal? ThreadLocal称作线程本地存储。简单来说,就是ThreadLocal为共享变量在每个线程中都创建一个副本,每个线程可以访问自己内部的副本变量。...对于下面的示例代码我们分析下: DemoA a=new DemoA(); DemoB b=new DemoB(a); a=null; 看似很正常的一段代码,但是将a对象的引用设置为null,当一个对象不再被其他对象引用的时候...而使用弱引用以后,当ThreadLocal被回收时,由于Entry的key是弱引用,不会影响ThreadLocal的回收防止内存泄漏,同时,在后续的源码分析中会看到,ThreadLocalMap本身的垃圾清理会用到这一个好处...ThreadLocal的内存泄漏 ThreadLocalMap中Entry的key使用的是ThreadLocal的弱引用,如果一个ThreadLocal没有外部强引用,当系统执行GC时,这个ThreadLocal...其实我们从源码分析可以看到,ThreadLocalMap是做了防护措施的 首先从ThreadLocal的直接索引位置(通过ThreadLocal.threadLocalHashCode & (len

    67050

    ThreadLocal原理分析与使用场景

    来源:https://urlify.cn/myyUVb 什么是ThreadLocal变量 ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread...ThreadLocal 变量通常被private static修饰。当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本都可被回收。...ThreadLocal实现原理 首先 ThreadLocal 是一个泛型类,保证可以接受任何类型的对象。...因为一个线程内可以存在多个 ThreadLocal 对象,所以其实是 ThreadLocal 内部维护了一个 Map ,这个 Map 不是直接使用的 HashMap ,而是 ThreadLocal 实现的一个叫做...1)存储用户Session 一个简单的用ThreadLocal来存储Session的例子: privatestaticfinal ThreadLocal threadSession = new ThreadLocal

    50520

    ThreadLocal 原理和使用场景分析

    ThreadLocal 不知道大家有没有用过,但至少听说过,今天主要记录一下 ThreadLocal 的原理和使用场景。...我们先笼统但不正确的分析一次 web 请求的过程: 用户在浏览器中访问 web 页面; 浏览器向服务器发起请求; 服务器上的服务处理程序(例如tomcat)接收请求,并开启一个线程处理请求,期间会使用到...1、创建 ThreadLocal mLocal = new ThreadLocal(); 2、创建并赋初值。...因为一个线程内可以存在多个 ThreadLocal 对象,所以其实是 ThreadLocal 内部维护了一个 Map ,这个 Map 不是直接使用的 HashMap ,而是 ThreadLocal 实现的一个叫做...所以说,最终的变量是放在了当前线程的 ThreadLocalMap 中,并不是存在 ThreadLocal 上,ThreadLocal 可以理解为只是一个中间工具,传递了变量值。

    2.3K40

    ThreadLocal原理分析与使用场景

    什么是ThreadLocal变量 ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。...这是也是 ThreadLocal 命名的由来。 既然每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就不存在多线程间共享的问题。 ThreadLocal 提供了线程本地的实例。...ThreadLocal 变量通常被private static修饰。当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本都可被回收。...ThreadLocal实现原理 首先 ThreadLocal 是一个泛型类,保证可以接受任何类型的对象。...因为一个线程内可以存在多个 ThreadLocal 对象,所以其实是 ThreadLocal 内部维护了一个 Map ,这个 Map 不是直接使用的 HashMap ,而是 ThreadLocal 实现的一个叫做

    42920
    领券