查看完整视频
小黑屋思过中,禁止观看!
评论并刷新后可见

您需要在视频最下面评论并刷新后,方可查看完整视频

积分观看

您支付积分,方可查看完整视频

{{user.role.value}}
付费视频

您支付费用,方可查看完整视频

¥{{user.role.value}}
课程视频

开通VIP,畅学所有专题课程视频

会员专享

视频选集

ThreadLocal深度源码剖析

  • 课程笔记
  • 交流讨论

ThreadLocal也属于经常面试的内容了,需要重点来掌握。

为了助大家掌握好ThreadLocal,这节课我会重点讲解以下6点:

1.ThreadLocal介绍
2.ThreadLocal的数据隔离
3.ThreadLocal的数据结构
4.深入ThreadLocal的底层实现
5.ThreadLocal的内存泄漏
6.ThreadLocal的应用场景

ThreadLocal介绍

多线程访问同一个共享变量的时候容易出现并发问题,为了保证线程安全,一般采用Synchronized、ReentrantLock等锁来解决,采用的是“以时间换空间”的形式。
ThreadLocal深度源码剖析-mikechen的互联网架构师之路

而今天我重点要讲解的ThreadLocal,则完全相反采用了“以空间换时间”的方式,为每一个线程都提供了一份变量副本,ThreadLocal里线程数据是互相隔离。

可以说,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。

ThreadLocal数据隔离

如果创建一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题,如下图所示:

ThreadLocal深度源码剖析-mikechen的互联网架构师之路

隐藏内容,您需要满足以下条件方可查看
End
3 条回复 A文章作者 M管理员
  1. 路正银

    线性探测,根据初始key的hashcode值确定元素在table数组中的位置,如果发现这个位置已经有其他key值的元素占用,则利用固定的算法寻找一定步长的下个位置,依次判断,直到找到能够存放的位置。
    1、找下一个位置,如超出table数组的长度,从table数组的第一个位置找起(自旋)
    2、ThreadLocalMap key是弱引用,key被回收之后,替换掉过期的值,把新值放入

  2. 李鸿翼

    e = tab[i = nextIndex(i, len)]

    ((i + 1 < len) ? i + 1 : 0);
    存储元素的底层是一个数组:Entry[] table; 默认长度是INITIAL_CAPACITY = 16;

    hash冲突采用的线性探测法: 直接定位i下一个元素,如果超过数组长度,索引又从0开始探测,直到找到元素e为空的时候,退出循环,然后插入元素。

  3. mikechen

    我来总结下:弱引用、Threadlocal原理、适用场景课里都讲过了,这些都属于必考项,如果还想考察,那一定是源码中的细节点(比如:冲突),冲突这个属于加分项,如果都很清楚,说明对ThreadLocal掌握的不错 ✗咧嘴笑✗