点击上面↑「爱开发」关注我们

每晚10点,捕获技术思考和创业资源洞察

什么是ThreadLocal

ThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数据,线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用。

ThreadLocal提供了线程安全的另一种思路,我们平常说的线程安全主要是保证共享数据的并发访问问题,通过sychronized锁或者CAS无锁策略来保证数据的一致性。

ThreadLocal结构图

从上面的结构图,我们已经窥见ThreadLocal的核心机制:

每个Thread线程内部都有一个Map。
Map里面存储线程本地对象(key)和线程的变量副本(value)
Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值。
对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离,彼此之间互不干扰。

我们来看个例子。

下面的例子有3个线程[thread#1],[thread#2],[thread#3]修改类变量initValue,当类变量是ThreadLocal的时候3个线程修改的值互不影响,打印的结果都是66

上面的例子3个线程是如果做到同时独立修改变量的,答案就在ThreadLocal的set(),get()方法里面.

下面我们再来看看ThreadLocal

ThreadLocal类提供如下几个核心方法:

get()方法用于获取当前线程的副本变量值。
set()方法用于保存当前线程的副本变量值。
initialValue()为当前线程初始副本变量值。
remove()方法移除当前前程的副本变量值。
get()方法

获取当前线程的ThreadLocalMap对象threadLocals
从map中获取线程存储的K-V Entry节点。
从Entry节点获取存储的Value副本值返回。
map为空的话返回初始值null,即线程变量副本为null,需要注意的是在使用中要判断是否为空指针NullPointerException。
set()方法

获取当前线程的成员变量map
map非空,则重新将ThreadLocal和新的value副本放入到map中。
map空,则对线程的成员变量ThreadLocalMap进行初始化创建,并将ThreadLocal和value副本放入map中。

remove()方法

Thread线程内部的Map在类中描述如下:

可以看到,这个ThreadLocalMap是线程中的变量,也就是说每个线程都是相互独立的

应用场景
类似单例类TransactionSynchronizationManager,

RequestContextHolder中就是通过ThreadLocal保存各自线程变量的副本,这样就不需要重新创建类。

一个知识点延伸出这么多知识点,关于弱引用、 内存优化等,不仅能考验求职者的对该知识点的掌握程度,又能考验求职者的知识面,难怪阿里百度这样的大公司喜欢在面试时拿它来考验求职者。

-END-
往期精选推荐
————————————————
版权声明:本文为CSDN博主「爱开发V」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/X8i0Bev/article/details/101086604

终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了相关推荐

  1. BAT这样的大公司为什么面试经常拿ThreadLocal考验求职者

    什么是ThreadLocal ThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数据,线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用. ThreadLoca ...

  2. 精彩回顾:终于明白阿里百度为什么拿WaitNotify通知机制考察求职者了

    终于明白阿里百度为什么拿WaitNotify通知机制考察求职者了 今天去面试,这道笔试题居然没做对,估计黄了 关于TCP三次握手,这是我见过最好的解读了,通俗易懂 Android的WebView中H5 ...

  3. 各大公司java面试整理对应问题博客整理

    各大公司java面试整理对应问题博客整理! 阿里 分库分表 数据库中间件 MyCAT是一个强大的数据库中间件,不仅仅可以用作读写分离,以及分表分库.容灾管理,而且可以用于多租户应用开发.云平台基础设施 ...

  4. Java程序员需要掌握哪些技能才能通过大公司的面试

    首先我们来谈一下程序员的阶段,在学校里的三年对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人.这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本上的内容迈向真正的企业级开发 ...

  5. 阿里、百度等多家公司Java面试记录与总结

    算算自己大概面试了近十家公司,也拿到了几个Offer,现在面试告一段落,简单总结下面试经验. 我现在主要的方向是Java服务端开发,把遇到的问题和大家分享一下,也谈谈关于技术人员如何有方向的提高自己, ...

  6. 各大公司硬件面试题目

    各大公司的硬件笔试题 f) 画出微机接口电路中,典型的输入设备与微机接口逻辑示意图(数据接口.控制接口.所存器/缓冲器) 3. 设想你将设计完成一个电子电路方案.请简述用EDA软件(如PROTEL)进 ...

  7. 字节-蚂蚁-百度等大厂大数据开发面试及各大公司真题

    目录 一 面试篇 1. 面试准备阶段 2. 关于面试的一些想法 二 真题篇 一 面试篇 1. 面试准备阶段 开始正式的面试前建议进行一到两个月的准备时间,准备的内容主要包括刷题.更新简历.看面经等. ...

  8. 终于明白阿里京东那些大厂,为什么经常拿HTTP考验求职者了

    前言 在竞争愈发激烈的2019年,寒冬的来临已经淘汰掉了很大一批的"CV战士":越来越多的人投身进了这场战役,从前几年的"增删改查",到现在的微服务高并发,竞争 ...

  9. 终于有阿里p8进行了大汇总(Redis+JVM+MySQL+Spring)还有面试题解全在这里了!

    Redis特性 Redis是一直基于键值对的NoSQL数据库: Redis支持5种主要数据结构:string.hash.list.set.zset以及bitmaps.hyperLoglog.GEO等特 ...

最新文章

  1. 前后台传值乱码问题解决
  2. JavaScript中的闭包
  3. 怎么把python模型部署到线上_如何将机器学习模型成功部署到.Net环境中
  4. 如何设计一个良好的接口
  5. computed用发_Vue中的computed属性和nextTick方法
  6. C++二分查找,时间复杂度是O(logn)
  7. python可以用来写什么_对于一个OIer,Python能干些什么?
  8. postman工具 如何传递当前时间戳和MD5加密
  9. 高中单招计算机基础知识题库,2015单招考试计算机基础知识题库
  10. 高三计算机专业vb试题二答案,高三计算机专业VB试题(二)
  11. 安装maven(mvn命令)
  12. B端产品运营基本工作内容
  13. 计算机病毒有熊猫病毒,世界最厉害的电脑病毒排名 熊猫烧香病毒最使人讨厌...
  14. 如何在产品经理工作面试中回答估算问题
  15. 君康人寿2019年排名_君康人寿保险靠谱吗?
  16. python多张图叠加为一张_python实现多张图片拼接成大图
  17. Python——组合数据类型的应用_1.英文句子中的词频统计
  18. 由建站学linux---第13课 域名重定向
  19. 高等数学学习(1)-函数
  20. 数据库中间件Mycat诞生记1

热门文章

  1. 海外对鸿蒙的态度,谷歌、三星挑明态度,国内厂商集体拒绝鸿蒙?任正非将如何应对?...
  2. 二维数组离散程度matlab,(十八)数据分析中的一些概念
  3. php 从第几开始截取,php如何实现截取前几个字符
  4. snmp linux arm,Net-SNMP的交叉编译 for ARM64
  5. 13.配置 influxDB 鉴权及 HTTP API 写数据的方法
  6. 1.18.Table API SQL(概念、依赖图、Table程序依赖、扩展依赖)
  7. 01_初识Matplotlib、Figure的组成、绘图函数的输入类型、第一个例子(学习笔记)
  8. 10_Eclipse中演示Git冲突的解决
  9. 检索数据_15_将空值转成其它值
  10. ip中继对接_IP软交换系统解决方案