美文网首页
ThreadLocal的set方法是否有死循环风险!!!

ThreadLocal的set方法是否有死循环风险!!!

作者: Tomy_Jx_Li | 来源:发表于2020-02-23 23:12 被阅读0次

背景

今天在看《码出高效》的时候,看到ThreadLocal,跟着书中内容进行源码阅读。通过查看set源码,突然发现,好像这里会发生死循环,但是……

1.首先查看set方法

1.set方法

2.查看ThreadLocalMap的set方法

2.ThreadLocalMap的set方法
如果这里e != null,满足条件,能进入循环,且k == keyk == null都不满足条件。那么就会导致一直执行e = tab[i = nextIndex(i, len)]这一行代码,这是为什么呢?查看方法nextIndex的源码可知

3.nextIndex方法

3.nextIndex源码

很明显,nextIndex方法是可以一直执行下去的,所以进入死循环。

4.不可能发生

但是,这一切却不可能发生,为什么呢!!!
首先因为ThreadLocalMap是一个Map,而该Map是有一个存储的阈值的,也就是threshold属性,当存储的数值达到阈值上线,就会进行扩容的。那么就需要查看下threshold的赋值情况了。

5.threshold的赋值

threshold的赋值
threshold的赋值只有这一个地方可以进行,所以一个ThreadLocalMap的存储上线就是其数组长度的三分之二。并且很重要的一个点ThreadLocalMap解决hash冲突是使用的开放寻址法,和HashMap的链表法不一样。
所以通过threshold,才使得这个看上去会发生死循环风险的代码能正常执行下去。

相关文章

  • ThreadLocal的set方法是否有死循环风险!!!

    背景 今天在看《码出高效》的时候,看到ThreadLocal,跟着书中内容进行源码阅读。通过查看set源码,突然发...

  • 了解ThreadLocal

    ThreadLocal 什么是ThreadLocal 存取实质 使用场景 使用方法 set()流程 get()流程...

  • 从源码分析ThreadLocal到底有什么用

    ThreadLocal使用示例 ThreadLocal两个主要方法: T get()获取值; void set(T...

  • ThreadLocal

    ThreadLocal定义 ThreadLocal是保存的线程的本地变量,访问get/set方法都是对线程独立的。...

  • ThreadLocal 源码在Android sdk 和JDK中

    最近看ThreadLocal源码时候,发现书上的 ThreadLocal.set() 方法的源码如下 对如valu...

  • 属性区别

    点语法的死循环注意 在set方法和get方法别用点语法,否则会产生死循环。以下两个方法会产生死循环 - (void...

  • ThreadLocal源码剖析

    ThreadLocal源码剖析 ThreadLocal其实比较简单,因为类里就三个public方法:set(T v...

  • ThreadLocal

    ThreadLocal ThreadLocal是一个线程独立存储类,通过他的get和set方法,在不同的线程中,可...

  • ThreadLocal内存泄漏

    ThreadLocal是为了解决对象不能被多线程共享访问的问题,通过ThreadLocal.set方法将对象实例保...

  • ThreadLocal

    ThreadLocal 类接口方法: void set(Object value) :设置当前线程的线程局部变量的...

网友评论

      本文标题:ThreadLocal的set方法是否有死循环风险!!!

      本文链接:https://www.haomeiwen.com/subject/wameqhtx.html