终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们
每晚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考验求职者了相关推荐
- BAT这样的大公司为什么面试经常拿ThreadLocal考验求职者
什么是ThreadLocal ThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数据,线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用. ThreadLoca ...
- 精彩回顾:终于明白阿里百度为什么拿WaitNotify通知机制考察求职者了
终于明白阿里百度为什么拿WaitNotify通知机制考察求职者了 今天去面试,这道笔试题居然没做对,估计黄了 关于TCP三次握手,这是我见过最好的解读了,通俗易懂 Android的WebView中H5 ...
- 各大公司java面试整理对应问题博客整理
各大公司java面试整理对应问题博客整理! 阿里 分库分表 数据库中间件 MyCAT是一个强大的数据库中间件,不仅仅可以用作读写分离,以及分表分库.容灾管理,而且可以用于多租户应用开发.云平台基础设施 ...
- Java程序员需要掌握哪些技能才能通过大公司的面试
首先我们来谈一下程序员的阶段,在学校里的三年对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人.这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本上的内容迈向真正的企业级开发 ...
- 阿里、百度等多家公司Java面试记录与总结
算算自己大概面试了近十家公司,也拿到了几个Offer,现在面试告一段落,简单总结下面试经验. 我现在主要的方向是Java服务端开发,把遇到的问题和大家分享一下,也谈谈关于技术人员如何有方向的提高自己, ...
- 各大公司硬件面试题目
各大公司的硬件笔试题 f) 画出微机接口电路中,典型的输入设备与微机接口逻辑示意图(数据接口.控制接口.所存器/缓冲器) 3. 设想你将设计完成一个电子电路方案.请简述用EDA软件(如PROTEL)进 ...
- 字节-蚂蚁-百度等大厂大数据开发面试及各大公司真题
目录 一 面试篇 1. 面试准备阶段 2. 关于面试的一些想法 二 真题篇 一 面试篇 1. 面试准备阶段 开始正式的面试前建议进行一到两个月的准备时间,准备的内容主要包括刷题.更新简历.看面经等. ...
- 终于明白阿里京东那些大厂,为什么经常拿HTTP考验求职者了
前言 在竞争愈发激烈的2019年,寒冬的来临已经淘汰掉了很大一批的"CV战士":越来越多的人投身进了这场战役,从前几年的"增删改查",到现在的微服务高并发,竞争 ...
- 终于有阿里p8进行了大汇总(Redis+JVM+MySQL+Spring)还有面试题解全在这里了!
Redis特性 Redis是一直基于键值对的NoSQL数据库: Redis支持5种主要数据结构:string.hash.list.set.zset以及bitmaps.hyperLoglog.GEO等特 ...
最新文章
- 前后台传值乱码问题解决
- JavaScript中的闭包
- 怎么把python模型部署到线上_如何将机器学习模型成功部署到.Net环境中
- 如何设计一个良好的接口
- computed用发_Vue中的computed属性和nextTick方法
- C++二分查找,时间复杂度是O(logn)
- python可以用来写什么_对于一个OIer,Python能干些什么?
- postman工具 如何传递当前时间戳和MD5加密
- 高中单招计算机基础知识题库,2015单招考试计算机基础知识题库
- 高三计算机专业vb试题二答案,高三计算机专业VB试题(二)
- 安装maven(mvn命令)
- B端产品运营基本工作内容
- 计算机病毒有熊猫病毒,世界最厉害的电脑病毒排名 熊猫烧香病毒最使人讨厌...
- 如何在产品经理工作面试中回答估算问题
- 君康人寿2019年排名_君康人寿保险靠谱吗?
- python多张图叠加为一张_python实现多张图片拼接成大图
- Python——组合数据类型的应用_1.英文句子中的词频统计
- 由建站学linux---第13课 域名重定向
- 高等数学学习(1)-函数
- 数据库中间件Mycat诞生记1
热门文章
- 海外对鸿蒙的态度,谷歌、三星挑明态度,国内厂商集体拒绝鸿蒙?任正非将如何应对?...
- 二维数组离散程度matlab,(十八)数据分析中的一些概念
- php 从第几开始截取,php如何实现截取前几个字符
- snmp linux arm,Net-SNMP的交叉编译 for ARM64
- 13.配置 influxDB 鉴权及 HTTP API 写数据的方法
- 1.18.Table API SQL(概念、依赖图、Table程序依赖、扩展依赖)
- 01_初识Matplotlib、Figure的组成、绘图函数的输入类型、第一个例子(学习笔记)
- 10_Eclipse中演示Git冲突的解决
- 检索数据_15_将空值转成其它值
- ip中继对接_IP软交换系统解决方案