ThreadLocal线程局部变量

定义:

      它是一个类,主要用于数据的传递,它是一种隐式传递消息的机制,可以从程序执行的上游向程序执行的下游传递数据。可用于解决多线程并发安全问题。

方法:

initialValue() 该方法返回值为null;如果程序员希望线程局部变量具有 null 以外的值,则必须为 ThreadLocal 创建子类,并重写此方法。通常将使用匿名内部类完成此操作。

注:线程第一次使用 get() 方法访问变量时将调用此方法,但如果线程之前调用了set(T) 方法,则不会对该线程再调用 initialValue 方法。通常,此方法对每个线程最多调用一次,但如果在调用 get() 后又调用了 remove(),则可以再次调用此方法。

引入:

      如下图,其中A,B.......Z是一系列的方法,A方法中包含B方法,B方法中包含C方法,C包含D..........Y方法中包含Z方法, 如果需要通过A方法传递一个参数给Z,则需要通过A传给B,B传给C,再传给D..........再传给Y,最后传给Z,这样太过于麻烦。

      现在有一个线程t1,我们知道, 线程就是程序执行的过程, 线程t1贯穿于A~Z整个程序执行的过程中, 我们又知道, 每个线程中都有一个map, 此时可以通过在A方法中拿到线程t1, 向t1的map中存入数据, 然后在Z方法中拿到线程t1,从t1的map中取出A存入的数据,就达到了数据传递的目的。这个思路很好,但实际用法需要借助ThreadLocal类来完成。

原理:

      首先通过ThreadLocal tl = new ThreadLocal()创建一个tl对象, 在A中调用tl.set(xxx), set()方法会自动找到当前线程t1,再找到t1内的map,以tl为键,XXX为值,即tl=xxx的方式将数据存入到t1的map中, 然后在Z中调用tl.get()取出数据,get()方法会先找到当前线程t1,以tl为键去t1的map中寻找对应的值,把找到的值进行返回 ,如果不需要这个数据时,可以通过tl.remove()将数据移除。

      现又来一个线程t2, 同理线程t2内有自己的map ,使用同一个tl对象,在A中调用tl.set(xxx), set()方法会自动找到当前线程t2,再找到t2内的map,以tl为键,XXX为值,即tl=xxx的方式将数据存入到t2的map中, 同理, 在Z中调用tl.get()取出数据,以及调用tl.remove()将数据移除。这样就可以处理多线程并发安全问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值