一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
背景
- 推荐阅读ThreadLocal工作过程、魔数的学习和疑问思考、ThreadLocal解决Hash碰撞
- 探究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即可。
小结
-
因为有hash冲突情况,因此找entry的时候,总是在循环去找,直到找到或者没有找到跳出循环。
-
移除的操作,首先执行了entry实例的clear()方法,然后把entry[]中具体某个下标的内容,置成null即可。这样有什么用?告诉jvm,某个key和value已经不存在引用了,希望能够及时GC掉,释放资源。