ThreadLocal存储原理

首先每一个Thread都有一个ThreadLocal.Values类型的localValues变量,ThreadLocal的set,get方法如下:

public void set(T value) {
        Thread currentThread = Thread.currentThread();
        Values values = values(currentThread);
        if (values == null) {
            values = initializeValues(currentThread);
        }
        values.put(this, value);
    }

public T get() {
        // Optimized for the fast path.
        Thread currentThread = Thread.currentThread();
        Values values = values(currentThread);
        if (values != null) {
            Object[] table = values.table;
            int index = hash & values.mask;
            if (this.reference == table[index]) {
                return (T) table[index + 1];
            }
        } else {
            values = initializeValues(currentThread);
        }

        return (T) values.getAfterMiss(this);
    }
values方法如下
Values values(Thread current) {
        return current.localValues;
    }
可以看到不管是set还是get 首先都会调用values(currentThread)来获取local'Values进行存取。localValues是每个线程的局部变量,所以就实现了线程本地存储。至于set和get的具体实现可以阅读源码。


ThreadLocal是Java中的一个线程局部变量,它提供了一种在多线程环境下保持变量的副本独立性的机制。每个线程都可以独立地修改自己的副本,而不会影响其他线程的副本。 ThreadLocal的底层原理主要涉及到两个关键点:ThreadLocalMap和Thread。 1. ThreadLocalMap:每个Thread对象内部都有一个ThreadLocalMap对象,用于存储线程局部变量的副本。ThreadLocalMap是一个自定义的哈希表,它的键是ThreadLocal对象,值是对应线程的变量副本。每个线程可以通过ThreadLocal对象获取自己的变量副本。 2. Thread:每个线程在创建时都会初始化一个ThreadLocalMap对象,并且在整个线程生命周期内都持有该对象。当线程需要获取或设置ThreadLocal变量时,会通过ThreadLocal对象在ThreadLocalMap中进行查找或修改。 具体的操作流程如下: - 当调用ThreadLocal的set方法时,会先获取当前线程的ThreadLocalMap对象,然后将ThreadLocal对象作为键,要设置的值作为值,存储ThreadLocalMap中。 - 当调用ThreadLocal的get方法时,同样会先获取当前线程的ThreadLocalMap对象,然后根据ThreadLocal对象在ThreadLocalMap中查找对应的值并返回。 - 当线程结束时,由于ThreadLocalMap是存储在Thread对象中的,所以Thread对象会被垃圾回收,从而自动清理掉对应的ThreadLocalMap。 总结一下,ThreadLocal通过在每个线程内部维护一个ThreadLocalMap来实现线程局部变量的存储和访问。每个线程都拥有自己独立的变量副本,互不干扰。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值