ThreadLocal部分源码解析

  1. 线程局部变量提供类,ThreadLocal< T >,简单说,对于某个变量(对象),为每个线程维护一个自己的独立副本,实现线程隔离

  2. ThreadLocal定义了内部静态类ThreadLocalMap,而Thread类内维护了一个ThreadLocalMap类型的成员变量:threadLocals

    /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;
    
  3. 内部类复习:实例化非静态内部类,必须先实例化外部类,非静态内部类可访问外部类的成员;而静态内部类,不可访问内部类资源,且可以直接实例化。简单来讲,静态内部类仅仅是处于外部类内而已。另:静态内部类可以有多个实例(个人理解,静态内部类的定义代码类似于静态方法,确实只有一份,但它的实例是不受静态约束的)。

  4. 那么,可以得出如下结论:每个Thread类对象持有一个独立的ThreadLocalMap对象,而ThreadLocal类,仅仅是一个操作ThreadLocalMap的工具类,每一个ThreadLocal对象,都对应操作某种线程局部变量对象

  5. 对于ThreadLocal变量推荐用static修饰。(个人猜想原因是:一个ThreadLocal实例已经能对多线程内的ThreadLocalMap进行某种局部变量的“多操”,即 一个对一种

  6. ThreadLocalMap类似于一个简单的HashMap,不过是用Entry数组实现的。 Entry 是其静态内部类:

    /**
     * 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 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadLocalJava中的一个线程本地变量,它提供了一种线程安全的方式来存储每个线程的局部变量。ThreadLocal的实现原理是在每个线程中创建一个独立的副本,每个线程都可以访问自己的副本,从而避免了线程安全问题。 ThreadLocal的内部结构主要包括ThreadLocal类和ThreadLocalMap类。ThreadLocal类是一个泛型类,用于存储线程本地变量的值。ThreadLocalMap类是一个自定义的哈希表,用于存储每个线程的ThreadLocal变量副本。 在jdk8之前,ThreadLocalMap是通过自定义的Entry数组来实现的,每个Entry包含一个ThreadLocal对象和对应的值。在jdk8之后,ThreadLocalMap的实现方式发生了变化,它使用了类似于HashMap的Node数组来存储Entry,从而提高了性能。 ThreadLocal内存泄漏问题是指在使用ThreadLocal时,由于没有及时清理ThreadLocal变量,导致线程结束后ThreadLocal变量没有被回收,从而导致内存泄漏。解决ThreadLocal内存泄漏问题的方法是在使用完ThreadLocal变量后,调用remove()方法将其从ThreadLocalMap中删除。 下面是一个简单的示例,演示了如何使用ThreadLocal来存储线程本地变量: ```java public class ThreadLocalDemo { private static final ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { Thread t1 = new Thread(() -> { threadLocal.set("Hello from thread 1"); System.out.println(threadLocal.get()); }); Thread t2 = new Thread(() -> { threadLocal.set("Hello from thread 2"); System.out.println(threadLocal.get()); }); t1.start(); t2.start(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值