ThreadLocal

先来了解一下什么是线程安全,就是一个类在单线程环境下能正常运行,并且在多线程环境下不做额外的处理也能正常运行,这种情况称之为线程安全。

在多线程访问共享变量时,如何保证线程安全?方法可以有很多种,比如常见的synchronized,lock,CAS等,今天来聊一聊大家可能没用过的ThreadLoacl。

ThreadLocal的使用也非常简单,例如

面试常问之ThreadLocal底层原理

那么底层是如何实现的呢?

在多线程访问这个变量的时候,每个线程都会拥有这个变量的副本 ,如图

面试常问之ThreadLocal底层原理

这样就可以避免多个线程竞争同一个变量导致的线程安全问题了。

下面从源码角度解析:
面试常问之ThreadLocal底层原理

Thread类有2个ThreadLocalMap类型的变量,分别是threadLocals和inheritableThreadLocals。ThreadLocalMap类似于hashmap。它的key是我们定义的ThreadLocal变量,是弱引用的。value是我们set的值。弱引用就是在垃圾回收时,如果发现,立马回收掉。关于引用类型会在后面写文章详解。value是强引用不会被回收,会导致内存泄漏的风险,关于如何排除内存泄漏,后面也会出一篇文章详解。

ThreadLocal不支持继承性,子线程是获取不到父线程的值的。可以使用inheritableThreadLocal来解决不能继承问题。它的底层实现也非常简单。当父线程创建子线程时,会把父线程的变量复制到子线程里面。

在JUC包里面的ThreadLocalRandom就是使用ThreadLocal原理实现的。

本文挖下的坑有synchronized,lock,CAS,hashmap,引用类型,内存泄漏。这些将在下面的文章中详解。欢迎大家关注微信公众号。
面试常问之ThreadLocal底层原理

相关文章:

  • 2020-07-17
  • 2021-05-24
  • 2021-10-16
  • 2021-11-16
  • 2021-12-19
  • 2021-05-29
  • 2021-10-09
猜你喜欢
  • 2021-11-28
  • 2021-06-15
  • 2021-01-24
  • 2018-11-13
  • 2021-08-22
  • 2021-12-30
  • 2021-11-30
相关资源
相似解决方案