在工作中遇到了一个ThreadLocal传值问题。因为公司业务有一个接口非常慢,所以想着使用异步的方法进行优化
但是因为业务中有redis分布式锁,而锁的值是用ThreadLocal来存储的,所以异步后会导致值丢失,锁无法释放
才有了本篇文章,研究ThreadLocal如何在不同线程中传递
首先来说一下线程传值的问题
现象 | 解决方案 | 介绍 |
---|---|---|
同一线程之间传递值 | ThreadLocal | 给线程提供一个本地变量,当线程消失的时候,所有的本地示例都会被回收 |
父子线程之间传递值 | InheritableThreadLocal | jdk提供的类,是ThreadLocal的升级版,解决父子线程之间传递值的问题 |
线程池不同线程传递值 | TransmittableThreadLocal | 简称TTL,是阿里巴巴团队提供的一个框架,主要解决因为存储线程池InheritableThreadLocal 失效的问题 |
准备工作
-
首先引入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.13.RELEASE</version> </parent> <groupId>org.example</groupId> <artifactId>threadLocal-demo</artifactId> <version>1.0-SNAPSHOT</version> <properties&g