Java并发之ThreadLocal

概念

  • ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。

作用

  • ThreadLocal允许我们将每个线程 ID 与相应对象的值相关联。 它允许我们为不同的线程存储不同的对象,并维护哪个对象对应于哪个线程。它有 set 和 get 方法,这些方法为使用它的每个线程维护一个单独的 value 副本。get() 方法总是返回从当前正在执行的线程传递给 set()的最新值

应用

  • JDBC的connection对象,为了避免connection对象作为方法参数多次传递
  • spring的事务

缺点

  • 降低了代码的可重用性
  • 类之间有隐藏的参数耦合性,使用时要格外的小心

踩坑

  • 线程池中使用ThreadLocal造成内存泄漏
    • 主要原因是因为ThreadLocal的释放,并不能直接让其对应的value被释放。
    • 在线程池中使用threadLocal时,thread会被反复的使用,因此theadLocalMap也不会被释放
    • 如果没有set, get, remove方法的调用,threadLocalMap中的Value,即使在theadLocal被设置为null后,仍然不能被释放
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tqc1OKis-1580718753970)(evernotecid://E654E5B8-6FF0-43A7-9FDE-3146227D8C68/appyinxiangcom/14842348/ENResource/p2858)]

应对办法:
在使用完自定义的threadLocal变量之后执行remove方法

ExecutorService es;
ThreadLocal tl;
es.execute(()->{
  //ThreadLocal增加变量
  tl.set(obj);
  try {
    // 省略业务逻辑代码
  }finally {
    //手动清理ThreadLocal 
    tl.remove();
  }
});

例子

给每个线程分配一个单独的id

import java.util.concurrent.atomic.AtomicInteger;
 
public class ThreadId {
  // Atomic integer containing the next thread ID to be assigned
  private static final AtomicInteger nextId = new AtomicInteger(0);

  // Thread local variable containing each thread's ID
  private static final ThreadLocal<Integer>; threadId =
      new ThreadLocal<Integer>() {
          @Override protected Integer initialValue() {
              return nextId.getAndIncrement();
      }
  };

  // Returns the current thread's unique ID, assigning it if necessary
  public static int get() {
      return threadId.get();
  }
}

常见面试题

  • ThreadLocal的应用场景? @见笔记
  • ThreadLocal内存泄漏的原因 @见笔记

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值