加入收藏 | 设为首页 |

卜-面试官:说说你对ThreadLocal的了解,小伙子这样答复,面试官很满足

海外新闻 时间: 浏览:177 次

每晚10点,捕获技能考虑和创业资源洞悉

张工是一名java程序员,最近到一家闻名互联网公司面试,面试官问,说说你对ThreadLocal的了解,张工刚好在面试前有所准备,所以梳理了ThreadLocal相关流程。面试官觉得张工思路清晰,根底扎心,表明很满足。

什么是ThreadLocal

ThreadLocal是一个本地线程副本变量东西类,各个线程都具有一份线程私有的数据,线程之间的变量互不搅扰,在高并发场景下,能够完成无状况的调用。

ThreadLocal供给了线程安全的另一种思路,咱们往常说的线程安全主要是确保同享数据的并发拜访问题,经过sychronized锁或许CAS无锁战略来确保数据的一致性。

ThreadLocal结构图


从上面的结构图,咱们现已窥见ThreadLocal的中心机制:

  • 每个Thread线程内部都有一个Map。
  • Map里边存储线程本地目标(key)和线程的变量副本(value)
  • Threa卜-面试官:说说你对ThreadLocal的了解,小伙子这样答复,面试官很满足d内部的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()办法


  1. 获取当时线程的ThreadLocalMap目标threadLocals
  2. 从map中获取线程存储的K-V Entry节点。
  3. 从Entry节点获取存储的Value副本值回来。
  4. map为空的话回来初始值null,即线程变量副本为null,需求留意的是在运用中要判别是否为空指针NullPointerException。

set()办法


  1. 获取当时线程的成员变量map
  2. ma卜-面试官:说说你对ThreadLocal的了解,小伙子这样答复,面试官很满足p非空,则从头将ThreadLocal和新的value副本放入到map中。
  3. map空,则对线程的成员变量ThreadLocalMap进行初始化创立卜-面试官:说说你对ThreadLocal的了解,小伙子这样答复,面试官很满足,并将ThreadLocal和value副本放入map中。

remove()办法


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


能够看到,这个ThreadLocalMap是线程中的变量,也便是说每个线程都是彼此独立的


使用场景

相似单例类TransactionSynchronizationManager,RequestContextHolder中便是经过ThreadLocal保存各自线程变量的副本,这样就不需求从头创立类。

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

-END-