Java小白的入门面试笔记--线程局部变量之灵魂四问

1.ThreadLocal 是什么?

ThreadLocal俗名叫做线程局部变量,就是由ThreadLocal通过set方法填充的变量,它是只属于当前的线程,对于其他的线程来说是隔离的,是当前线程独有的变量。它的本质就是ThreadLocal在每一个线程当中都创建了一个自己的“副本”,每一个线程都只可以访问属于自己的副本变量,同一个ThreadLocal所包含的对象,在不同的Thread中有不同的几种副本。

2.ThreadLocal的特征有哪些?

线程局部变量是局限于线程内部的变量,只属于创建它的线程自身所有,不能与其他线程共享这一资源,是一种实现线程安全的方法。但是要注意:单个线程内可以共享,多个线程之间不可以共享。并且任何局部线程在使用结束之后没有释放的话,就会导致内存泄漏。(具体原因在原理中介绍)

3.ThreadLocal的原理?

在Thread类中有一个成员变量叫做ThreadLocalMap,它的底层实现是一种Map容器,它的键Key是ThreadLocal类,每一个线程拥有自己的申明为ThreadLocal类型的变量,所以它的值value就是这个线程本身。每个线程执行时都会把局部变量放在各自的帧栈的内存空间中,此变量生命周期是由该线程决定的,开始于第一次初始化(get或者set方法)。由ThreadLocal的工作原理决定了:每个线程独自拥有一个变量,并非共享或者拷贝。而为什么线程使用完后不释放会导致内存泄漏呢,因为ThreadLocalMap的键ThreadLocal类是一种弱引用,会在使用完成后由gc自动回收走,而它的值依然具有强引用便不会被自动回收,从而导致了内存的泄漏。所以在使用ThreadLocal后要记得将它remove。

4.ThreadLocal的使用场景?

需要为线程设置自己的局部变量来存储不同线程的私有数据,但是系统并没有这样的局部变量,如果采用实例属性那么必须对其进行同步。为了解决这一问题,系统为程序员提供了ThreadLocal类,它代表了线程的局部变量,它为每一个线程提供了独立的存储区域,这些线程在运行时只能看到自己的值,各个值之间也没有交叉和联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值