首先还是自己的理解:
1:ThreadLocal 是干嘛的:
翻译过来意思为线程局部变量,成员变量不做任何处理的话线程是不安全的,各个线程都在操作同一个变量,显然是不行的,volatile这个关键字也不能保证线程安全,我们要满足变量是同一个,但每个线程都使用同一个初始值,也就是使用同一个变量的一个新的副本。比如说DAO的数据库连接,我们知道DAO是单例的,那么他的属性Connection就不是一个线程安全的变量。而我们每个线程都需要使用他,并且各自使用各自的。这种情况,ThreadLocal就比较好的解决了这个问题。
ThreadLocal里面有一个内部类,Thread中有一个map就是ThreadLocalMap,ThreadLocalMap的key是ThreadLocal,值是我们自己设定的。ThreadLocal是一个弱引用,当为null时,会被当成垃圾回收。
Threadlocal是一个线程内部的存储类,在指定的线程中存储数据。官方解释如下。
/**
* This class provides thread-local variables. These variables differ from
* their normal counterparts in that each thread that accesses one (via its
* {@code get} or {@code set} method) has its own, independently initialized
* copy of the variable. {@code ThreadLocal} instances are typically private
* static fields in classes that wish to associate state with a thread (e.g.,
* a user ID or Transaction ID).
*/
大致意思就是ThreadLocal提供了线程内存储变量的能力,这些变量不同之处在于每一个线程读取的变量是对应的互相独立的,通过get和set方法就可以得到当前线程对应的值。
实际上是ThreadLocal的静态内部类ThreadLocalMap为每个Thread都维护了一个数组table,ThreadLocal确定了一个数组下标,而这个下标就是value存储的对应位置。。
2.应用场景
应用场景:当很多线程需要多次使用同一个对象,并且需要该对象具有相同初始化值的时候最适合使用ThreadLocal。
后续完善