ThreadLocalMap原理源码级讲解

本文详细解析了Java中的ThreadLocal在1.7和1.8版本的区别,强调1.8版本的优化点,包括减少遍历时间和避免哈希冲突。同时,解释了ThreadLocal的set和get方法的工作原理,并介绍了ThreadLocalMap的内部结构。文章还讨论了ThreadLocal可能导致的内存泄漏问题及其解决方案,建议在使用完毕后调用remove方法以防止内存泄漏。

1.7版本和1.8版本是不一样的。

1.7版本:

ThreadLocal里面维护一个TheradLocalMap,底层是Map,再底层是entry对象,(key,value)形式,key是Thread,value是需要隔离的变量。

1.8版本 :

每个Thread都维护了一个ThreadLocalMap,底层是Map,再底层是entry对象,entry中存储ThreadLocal是key,value是需要隔离的变量。

1.8版本的好处 :

1 .每个Map存储的Entry数量很少,因为1.7版本,每个线程就会代表一个entry,线程越多,entry越多,遍历耗时。1.8版本改成了entry中存储ThreadLocal和value,一般开发过程中,ThreadLocal数量是小于Thread的,所以时间上有优势。因为key少了,也可以避免哈希冲突。hashMap的哈希冲突是拉链法,而ThreadLocalMap的hash冲突是线性探索法。

2 .当Thread销毁的时候,ThreadLocalMap也会随之销毁,减少内存的使用。因为ThreadLocalMap是在Thread里面的,所以只要Thread消失了,那map就不复存在了。

ThreadLocal的set方法原理 :

public void set(T value) {
//获取当前线程对象
    Thread t = Thread.currentThread();
//获取此线程对象中维护的ThreadLocalMap对象
    ThreadLocalMap map = getMap(t);
    if (map != null)
 //map存在则调用set方法,set设置此实体entry
        map.set(this, value);
   
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值