面试常问之ThreadLocal底层原理

ThreadLocal

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

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

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

在这里插入图片描述

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

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

面试常问之ThreadLocal底层原理_第1张图片

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

下面从源码角度解析:
面试常问之ThreadLocal底层原理_第2张图片

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

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

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

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

你可能感兴趣的:(面试)