Java 线程之 ThreadLocal 应用
1. ThreadLocal
- 普通的静态变量是所有线程共享的,ThreadLocal 可让每个线程创建自己的本地变量
- ThreadLocal 为每一个线程都提供一个变量副本,隔离多个线程对数据的数据共享
2. 实战
- 注:ThreadLocal不可以使用原子类型,只能使用Object类型
2.1 父子线程变量继承:ThreadLocal 与 InheritableThreadLocal
@Slf4j
public class Demo {
// 案例一:ThreadLocal 不支持继承
// 16:22:57.889 [main] - Hello
// 16:22:57.889 [Thread-1] - null 子线程获取不到父线程的本地变量
// public static ThreadLocal threadLocal = new ThreadLocal<>();
// 案例二:InheritableThreadLocal 应用场景:获取用户登陆信息
// 16:39:13.397 [Thread-1] - Hello
// 16:39:13.397 [main] - Hello
public static ThreadLocal threadLocal = new InheritableThreadLocal<>();
@Test
public void threadLocalDemo() {
threadLocal.set("Hello");
new Thread(() -> {
log.info(threadLocal.get());
}).start();
log.info(threadLocal.get());
}
}
3. 应用场景
3.1 应用
Spring 事务处理使用 ThreadLocal
3.2 ThreadLocal 慎用场景
场景一:线程池里线程调用 ThreadLocal,
线程池的线程都是复用的,在线程池中线程非常难结束甚至于永远不会结束,线程持续的时间将不可预测
场景二:异步程序中使用ThreadLocal
因为线程将请求发送后,不会等待远程返回结果,而是继续向下运行,真正的返回结果得到后,处理的线程可能是其他的线程
共有 0 条评论