补日志 Java LocalStorge

本文探讨了如何使用ThreadLocal类在Java中为每个线程绑定特定的对象,避免了对象共享导致的数据竞争问题。通过分析ThreadLocal的源码,揭示了其内部实现机制,包括如何利用弱引用和ThreadLocalMap防止内存泄漏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们自己的程序所运行的Thread 非我们自己New的。但我们想绑定一些对象给这些线程,怎么办。

LocalStorage来帮忙,我们可以将多个对象绑定到当前线程。

 

class c1{
    ThreadLocal<String> tl1= new ThreadLocal(); 

    ThreadLocal<String> tl2= new ThreadLocal(); 

    public method1(String in_str1,String int_str2) { 
        tl1.set(in_str1);
        
        tl2.set( in_str1);
    }
}

 

ThreadLocal 源码

public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }


   void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }


ThreadLocalMap 源码
ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
            table = new Entry[INITIAL_CAPACITY];
            int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
            table[i] = new Entry(firstKey, firstValue);
            size = 1;
            setThreshold(INITIAL_CAPACITY);
        }

Entry
static class Entry extends WeakReference<ThreadLocal<?>> 

Thread
ThreadLocal.ThreadLocalMap threadLocals = null;

每个 Thread 有一个ThreadLocalMap(map) 叫 threadLocals(注意是复数),是强引用,这个map的每一entry的key 是一个WeakReference,可以被gc掉的,哪怕当前线程是活的,这个key运行时就是tl1或者tl2 ,如果是Strong Reference(比如普通的HashMap),会造成memory leak,因为1.我们不能控制线程的结束和2.这个map在Thread实例是强引用。线程的生命周期是由容器比如tomcat控制的。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值