核心知识-ThreadLocal介绍+经典应用场景
什么是ThreadLocal
全称thread local variable(线程局部变量)功用非常简单,使用场合主要解决多线程中数据因并发产生不一致问题。
ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享,这样的结果是耗费了内存,但大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。
总结起来就是:同个线程共享数据
注意:ThreadLocal不能使用原子类型,只能使用Object类型
ThreadLocal的底层原理
ThreadLocal是解决多线程*享变量的问题。所以若每个线程有自己单独地变量就可以解决该问题。
ThreadLocal的设计原理也是如此:在每个Thread中有单独地ThreadLocalMap,它相当于一个map。
它的key是ThreadLocal,值是Object。相当于对于单线程而言,每个ThreadLocal都会放在这个Map中,且有效隔离。
对于多线程而言,有多个ThreadLocalMap,使用同一个ThreadLocal作为key,每个线程中的ThreadLocalMap的值是隔离的。
对于多线程多ThreadLocal而言,也是同理。
简单来说,就是每一个线程有单独隔离的ThreadLocalMap,而ThreadLocal仅仅是ThreadLocalMap中的一个Key,用于获取Value,而Value正因为ThreadLocalMap是隔离的,所以它也是被隔离的。
核心应用场景
ThreadLocal 用作每个线程内需要独立保存信息,方便同个线程的其他方法获取该信息的场景。
每个线程获取到的信息可能都是不一样的,前面执行的方法保存了信息后,后续方法可以通过ThreadLocal 直接获取到,避免了传参,类似于全局变量的概念,比如用户登录令牌解密后的信息传递(还有用户权限信息、从用户系统获取到的用户名、用户ID)