5.ThreadLocal类

1.什么是ThreadLocal?用来干什么?
2.说说ThreadLocal是怎么实现的?
3.说说ThreadLocal会带来什么问题?该怎么解决?


1.Q:什么是ThreadLocal?用来干什么?

ThreadLocal,线程本地,用来保存线程自己私有的数据。

A:ThreadLocal可以让每个线程绑定它自己的值,就像一个私有盒子,每个线程可以绑定它自己私有的数据

2.Q:说说ThreadLocal是怎么实现的?
A:用的是ThreadLocal的静态内部类ThreadLocalMap实现的,它是定制的HashMap。

threadlocals是Thread类的属性变量,类型为ThreadLocalMap,默认为null。当调用ThreadLocal的get()或set()方法时,如果threadlocals变量为null,才去创建它。(把线程的threadlocals变量读过来修改了)而ThreadLocal的get()和set()其实是调用的ThreadLocalMap的get()和set()方法。

这个ThreadLocalMap的key是ThreadLocal引用value是该线程的私有数据Object的值

注意:ThreadLocal外面有它的get()和set(),但其静态内部类ThreadLocalMap也有对应的get()和set(),它们是不同的。而且外面的是调用里面的来实现的。

3.Q:说说ThreadLocal会带来什么问题?该怎么解决?
A:ThreadLocal会带来内存泄漏的问题。(就是内存资源不用了,但是也释放不掉)。
因为ThreadLocalMap里的Entry的key为ThreadLocal,使用的是弱引用通过WeakReference来实现),而value为Object是强引用
弱引用如果被垃圾回收器发现,不论怎样都会被回收。所以会出现Entry中key为null(被回收),valueObject强引用依然存在的情况。这样Object不会被回收,所以就造成了内存泄漏问题。

解决方法:ThreadLocal在用get(),set(),remove()时考虑了这个问题,方法结束后会把所有key为null的记录清除但是推荐使用完ThreadLocal后,最好自己调用一下remove()方法,来避免内存泄漏问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值