java多线程总结(一)
1.什么是ThreadLocal?
所谓ThreadLocal就是Thread的一个局部变量,当时用ThreadLocal维护变量时,它为每个使用该变量的线程提供一个独立的线程副本,所以每一个线程都可以独立的维护自己的副本,而不会影响其他线程。
2.ThreadLocal的作用
它的作用是提供线程内的局部变量,这种变量在线程的生命周期内有效,可以减少同一个线程内多个函数或组件之间传递变量的复杂程度。
3.ThreadLocal为每一个线程维护变量的副本的方法
基本的实现思路如下:在ThreadLocal类中存在一个使用static修饰的Map集合,用来存储每一个线程的变量副本,Map元素中键值为每一个线程对象,值为对应的线程的变量副本。
自定义案例如下:
4.Thread、ThreadLocal和ThreadLocal之间的关系
从上图可以看出每个Thread实例都对应着一个ThreadLocalMap,而每个Thread中分别存放着entry,默认的是一个ThreadLocalMap可以初始化16个entry,每一个entry对象中存放着一个ThreadLocal对象
5.ThreadLocalMap的构造函数
ThreadLocalMap的map实现的是使用了一个entry类型的数组entry[]table来保存键值对的实体,初始容量为16,ThreadLocalMap自己实现了从key到value的映射。
6.ThreadLocal的set函数
每个Thread实例都有一个ThreadLocalMap,所以在进行set的时候,首先根Thread.currentThread()方法获取当前正在执行的线程,然后根据当前线程t,调用getMap(t)获取ThreadLocalMap对象,如果第一次是控制,会调用creatMap方法创建新的ThreadLocalMap。否则,直接将value值存入map集合。
7.使用ThreadLocalMap去保存线程局部对象的原因
一个线程可能会拥有很多的局部对象,如此的话,不管一个线程拥有多少个局部变量,都是使用同一个ThreadLocalMap来保存,ThreadLocalMap中的entry[]数组的初始容量大小为16,超过其容量的2/3时会扩容,然后再回到map不为空的部分:会调用map.set(this,value)方法,以当前Thread的引用为key,获得ThreadLocalMap,然后调用map.set(this,value)保存进privte entry[]tables;