1、ThreadLocal:
Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
ThreadLocal是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据。用于解决多线程中相同变量的访问冲突问题。
ThreadLocal提供了线程内存储变量的能力,这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过get和set方法就可以得到当前线程对应的值。
2、ThreadLocal和Synchronized:
ThreadLocal和Synchronized都是为了解决多线程中相同变量的访问冲突问题,不同的点是:
1)Synchronized是通过线程等待,牺牲时间来解决访问冲突。
2)ThreadLocal是通过每个线程单独一份存储空间,牺牲空间来解决冲突,并且相比于Synchronized,ThreadLocal具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问到想要的值。
3、ThreadLocal的底层:
ThreadLocal底层维护着一个静态内部类ThreadLocalMap,每个Thread中定义了一个变量,threadLocals,类型就是ThreadLocalMap。ThreadLocalMap底层维护了一个Entry类型的数组,我们遍历Map就使用到了Entry<k,v>,Entry中由new的ThreadLocal<?>对象作为key,以存储的值作为value。也就是说Thread底层都维护了一个entry[]的数组tabel。new 的ThreadLocal对象确定再线程维护的数组的下标位置,而这个下标就是value存储的对应位置。Entry是集成WeekReference,且构造中可以将new 的ThreadLocal作为弱引用。
在Thread类中存在一个ThreadLocal.ThreadLocalMap类型的变量,threadLocals,用于储存线程私有资源。
在ThreadLocal.ThreadLocalMap静态类中维护了一个Entry类型的数组table。用于存储这个Thread线程中所有的独立数据。
4、ThreadLocal的set方法,创建ThreadLocalMap方法:
//set 方法
public void set(T value) {
//获取当前线程
Thread t = Thread.currentThread();
//获取当前线程中的ThreadLocalMap变量,实际存储的数据结构类