ThreadLocal是干什么的呢,有什么作用?
我们都知道,当多个线程访问同一个对象时,会产生线程安全问题,这是会用到锁的机制。
但是当多个线程访问同一个变量,并且也不需要改变这个变量最终的值,这时可以用到ThreadLocal。
ThreadLocal的作用为:每一个线程都可以拥有一份副本,且操作都只是操作自己当前副本中的值,
简单的用法为下图
这时线程1和线程2的值分别为2和3,相互之间都自己拥有一份副本。互不干扰
那么是怎么实现的呢
来大致的看一下源码
可以看到,前面threadLocal.set(integer);方法中,首先获取当前线程,然后通过getMap()方法传入当前线程对象,调用t.threadLocals,获取到一个ThreadLocalMap对象, ThreadLocalMap 是ThreadLocal的静态内部类,然后Thread中拥有这个成员,等同于getMap返回Thread的成员属性,然后看map的set方法
可以看到以将当前threadLocal作为key,value的方式保存在Entry数组中,这个Entry数组对象是threadLocalMap 的成员变量
获取值也没什么好说的,获取当前线程的ThreadLocalMap,然后获取ThreadLocalMap的Entry,通过以当前ThreadLocalMap作为key取对应的value并返回
可以看出大致的逻辑不是很复杂,通俗点说,每个线程中都有一个ThreadLocalMap对象,ThreadLocalMap对象中又有一个数组Entry,以当前ThreadLocal作为key的方式,(注:ThreadLocal一般为静态对象,比如handler中,key为同一个对象(ThreadLocal本身),但是threadLocalMap是不同的(不同线程))将value保存起来,然后get或者set 都是通过这种方式来进行操作。从而实现了线程隔离,每个线程的值都是自己的副本,不会相互影响。
Thread中有ThreadLocalMap,set就是将ThreadLocal作为key存进ThreadLocalmap中,不同线程的ThreadLocal
Map不是同一个对象,这就实现了隔离,同一个线程中可以有多个ThreadLocal,因为在ThreadLocalMap中ThreadLocal作为key。