ThreadLocal
ThreadLocal
ThreadLocal简介
ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。
如果你创建了一个TheadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本。他们可以使用get()和se()方法来获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程的安全问题。
ThreadLocal原理
Thead类源码:
Thread类中有一个threadLocals和一个inheritableThreadLocals变量,它们都是ThreadLocalMap类型变量。最终的变量是放在了当前线程的ThreadLocalMap中,并不是存在ThreadLocal上,ThreadLocal可以理解为只是ThreadLocalMap的封装,传递了变量值。ThreadLocal类中可以通过Thread.currentThread()获取到当前线程对象后,直接通过GetMap(Thread t)可以访问到该线程的ThreadLoaclMap对象。
ThreadLocal的静态内部类ThreadLocalMap为每个Thread都维护了一个数组table,ThreadLocal确定了一个数组下标,而这个下标就是value存储的对应位置。
ThreadLocal内部维护的好似一个类似Map的ThreadLocalMap的数据结构,key为当前对象的Thread对象,值为Object对象。
ThreadLocal特性
ThreadLocal和Synchronized都是为了解决多线程中相同变量的访问冲突问题,不同的点是:
- Synchronized是通过线程等待,牺牲时间来解决访问冲突
- ThreadLocal是通过每个线程单独一份存储空间,牺牲空间来解决冲突,并且相比于Synchronized,ThreadLocal具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问到想要的值。
正因为ThreadLocal的线程隔离特性,使他的应用场景相对来说更为特殊一些。在android中Looper、ActivityThread以及AMS中都用到了ThreadLocal。当某些数据是以线程为作用域并且不同线程具有不同的数据副本的时候,就可以考虑采用ThreadLocal。
本文地址:https://blog.csdn.net/weixin_43489232/article/details/110630406