超简单的ThreadLocal

  多线程访问同一个共享变量的时候容易出现并发问题,很多时候我们是通过加锁解决的。但是,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。那么这就要提到 ThreadLocal 了。比如很多公司做单点登录会用到 ThreadLocal ,通过拦截 token 去获取当前登录信息。

ThreadLocal<Integer> local = new ThreadLocal<>();

new Thread(()->{
    local.set(7);
    System.out.println(local.get());
}).start();

new Thread(()->{
    local.set(5);
    System.out.println(local.get());
}).start();

set

1. local.set() 首先是获取到当前线程 t
2. 然后获取到这个线程的 ThreadLocalMap ,可以看到里面是个类似 map 的结构,然后 Entry 本身是个数组,也就是说差不多一个 数组 的注册表。
3. map.set(this,value) 就是把当先线程的引用作为 key ,以  键值对  的形式存到enrty中

get

也是获取到当前线程后,根据与运算计算出 当前线程 在数组的中的位置,在根据 key(也就是当前线程引用) 获取到value。

原文地址:https://www.cnblogs.com/wlwl/p/15039227.html