ThreadLocal原理详解--面试粉碎机

网站建设4年前发布
40 0 0

20230307140658283a68f81e453e981a24427a4770624d0b04fe838,void set(Object value),设置当前线程的线程局部变量的值,public Object get(),该方法返回当前线程所对应的线程局部变量,public void remove(),将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度;,ThreadLocal里设置的值,只有当前线程自己看得见,这意味着你不可能通过其他线程为它初始化值。为了弥补这一点,ThreadLocal提供了一个withInitial()方法统一初始化所有线程的ThreadLocal的值:,上述代码将ThreadLocal的初始值设置为6,这对全体线程都是可见的,作为一个存储数据的类,关键点就在get和set方法。,构造函数首先创建一个长度为16的Entry数组,然后计算出firstKey对应的索引,然后存储到table中,并设置size和threshold。,通过计算出索引直接从数组对应位置读取即可;,我们调用threadLocal的set,get方法时,会判断当前的key是否为null,将Entry中的value赋值为null,但是这个释放value还有其他条件限制,并不是一定会发生,当系统内存不足时,由于Entry中的key继承软引用,回被垃圾回收器回收调,这时,Entry中的key为null,无法被线程访问,但是value仍然占用一定的内存空间,虽然在调用set,get方法时有可能进行系统回收,仍然无法回收无用所有内存。无法被访问的vlaue就会导致内存泄漏,怎么解决内存泄漏呢,最好的方法就是当我们使用完变量副本后及时调用remove方法,手动进行垃圾回收。,2023030700245735771e9860c86393364271699efa95e2fda617213,

© 版权声明

相关文章