java编程ThreadLocal上下传递源码分析


这篇文章主要讲解了“java编程ThreadLocal上下传递源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java编程ThreadLocal上下传递源码分析”吧!ThreadLocal 提供了一种方式,让在多线程环境下,每个线程都可以拥有自己独特的数据,并且可以在整个线程执行过程中,从上而下的传递。可能很多同学没有使用过 ThreadLocal,我们先来演示下 ThreadLocal 的用法,demo 如下:从运行结果中可以看到,key1 对应的值已经从上下文中拿到了。getFromComtext 方法是没有接受任何入参的,通过 context.get().get(“key1”) 这行代码就从上下文中拿到了 key1 的值,接下来我们一起来看下 ThreadLocal 底层是如何实现上下文的传递的。ThreadLocal 定义类时带有泛型,说明 ThreadLocal 可以储存任意格式的数据,源码如下:ThreadLocal 有几个关键属性,我们一一看下:还有一个重要属性:ThreadLocalMap,当一个线程有多个 ThreadLocal 时,需要一个容器来管理多个 ThreadLocal,ThreadLocalMap 的作用就是这个,管理线程中多个 ThreadLocal。ThreadLocalMap 本身就是一个简单的 Map 结构,key 是 ThreadLocal,value 是 ThreadLocal 保存的值,底层是数组的数据结构,源码如下:从源码中看到 ThreadLocalMap 其实就是一个简单的 Map 结构,底层是数组,有初始化大小,也有扩容阈值大小,数组的元素是 Entry,Entry 的 key 就是 ThreadLocal 的引用,value 是 ThreadLocal 的值。ThreadLocal 是线程安全的,我们可以放心使用,主要因为是 ThreadLocalMap 是线程的属性,我们看下线程 Thread 的源码,如下:从上图中,我们可以看到 ThreadLocals.ThreadLocalMap 和 InheritableThreadLocals.ThreadLocalMap 分别是线程的属性,所以每个线程的 ThreadLocals 都是隔离独享的。父线程在创建子线程的情况下,会拷贝 inheritableThreadLocals 的值,但不会拷贝 threadLocals 的值,源码如下:从上图中我们可以看到,在线程创建时,会把父线程的 inheritableThreadLocals 属性值进行拷贝。set 方法的主要作用是往当前 ThreadLocal 里面 set 值,假如当前 ThreadLocal 的泛型是 Map,那么就是往当前 ThreadLocal 里面 set map,源码如下:代码逻辑比较清晰,我们在一起来看下 ThreadLocalMap.set 的源码,如下:上面源码我们注意几点:是通过递增的 AtomicInteger 作为 ThreadLocal 的 hashCode 的;计算数组索引位置的公式是:hashCode 取模数组大小,由于 hashCode 不断自增,所以不同的 hashCode 大概率上会计算到同一个数组的索引位置(但这个不用担心,在实际项目中,ThreadLocal 都很少,基本上不会冲突);通过 hashCode 计算的索引位置 i 处如果已经有值了,会从 i 开始,通过 +1 不断的往后寻找,直到找到索引位置为空的地方,把当前 ThreadLocal 作为 key 放进去。好在日常工作中使用 ThreadLocal 时,常常只使用 1~2 个 ThreadLocal,通过 hash 计算出重复的数组的概率并不是很大。set 时的解决数组元素位置冲突的策略,也对 get 方法产生了影响,接着我们一起来看一下 get 方法。get 方法主要是从 ThreadLocalMap 中拿到当前 ThreadLocal 储存的值,源码如下:接着我们来看下 ThreadLocalMap 的 getEntry 方法,源码如下:get 逻辑源码中注释已经写的很清楚了,我们就不重复说了。ThreadLocalMap 中的 ThreadLocal 的个数超过阈值时,ThreadLocalMap 就要开始扩容了,我们一起来看下扩容的逻辑:源码注解也比较清晰,我们注意两点:扩容后数组大小是原来数组的两倍;扩容时是绝对没有线程安全问题的,因为 ThreadLocalMap 是线程的一个属性,一个线程同一时刻只能对 ThreadLocalMap 进行操作,因为同一个线程执行业务逻辑必然是串行的,那么操作 ThreadLocalMap 必然也是串行的。感谢各位的阅读,以上就是“java编程ThreadLocal上下传递源码分析”的内容了,经过本文的学习后,相信大家对java编程ThreadLocal上下传递源码免费云主机域名分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!

相关推荐: HTML5+CSS3基础响应式页面布局实例分析

这篇文章主要介绍了HTML5+CSS3基础响应式页面布局实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇HTML5+CSS3基础响应式页面布局实例分析文章都会有所收获,下面我们一起来看看吧。   一、响应式页面布局的概念  …

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 01/14 11:55
下一篇 01/14 11:55

相关推荐