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);

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

被折叠的 条评论
为什么被折叠?



