ThreadLocal源码阅读七:核心方法remove源码探究

149 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

背景

  1. 推荐阅读ThreadLocal工作过程魔数的学习和疑问思考ThreadLocal解决Hash碰撞
  2. 探究ThreadLocal源码中核心方法remvoe的工作过程及其实现细节。

过程

  • remove方法入口 在这里插入图片描述

注释含义: 把当前线程中的本地变量值移除。如果执行了remove操作,随后又执行get操作,则将会调用initialValue函数。还有一种情况,就是在调用调用了remove操作,随后调用set操作了,那么不会执行initialValue函数了。

  • remove 在这里插入图片描述 注释含义: 把key所有对应的entry实例移除掉。

细节

在for循环中,为什么要取得下一个脚标呢? 这就是原来存储entry实例的时候,计算出来的ThreadLocal的hash码出现冲突。 因此需要往后遍历整个数组。直到找到某个entry实例是null的情况,跳出循环即可。

那是怎么移除的呢?

首先执行entry实例的clear()方法,即是this.referent = null; 然后执行expungeStaleEntry(i),把下脚标的为i的entry的key和value都置成null即可。

小结

  1. 因为有hash冲突情况,因此找entry的时候,总是在循环去找,直到找到或者没有找到跳出循环。

  2. 移除的操作,首先执行了entry实例的clear()方法,然后把entry[]中具体某个下标的内容,置成null即可。这样有什么用?告诉jvm,某个key和value已经不存在引用了,希望能够及时GC掉,释放资源。