前言
ThreadLocal是用来在多线程中隔离变量的,但是在线程池中会有取值错误的问题
可以使用TransmittableThreadLocal
来进行代替
一、添加依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/transmittable-thread-local -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
<version>2.14.5</version>
</dependency>
二、使用
import com.alibaba.ttl.TransmittableThreadLocal;
import com.alibaba.ttl.threadpool.TtlExecutors;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author : Serena nya ๑乛◡乛๑
* @date : 10:48 上午
*/
public class Test {
public static void main(String[] args) {
// final ThreadLocal<Integer> threadLocal =ThreadLocal.withInitial(() -> 0);
// Ttl包中(重点1)
final TransmittableThreadLocal<Integer> threadLocal = TransmittableThreadLocal.withInitial(() -> 0);
ExecutorService executorService = Executors.newFixedThreadPool(2);
// 由TtlExecutors对原有的线程池进行包装(重点2)
Executor ttlExecutor = TtlExecutors.getTtlExecutor(executorService);
for (int i = 0; i < 5; i++) {
Integer num = CompletableFuture.supplyAsync(() -> {
threadLocal.set(threadLocal.get() + 1);
return threadLocal.get();
}, ttlExecutor).join();
System.out.println(num);
}
executorService.shutdown();
}
}
其中有两个重点是需要注意的,缺一不可