ThreadLocal 的总结

ThreadLocal 为每一个使用该变量的线程都提供了独立的副本,可以做到线程间的数据隔离,每一个线程都访问各自内部的副本变量。ThreadLocal 内部是一个ThreadLocalMap,ThreadLocal实例作为key(弱引用),将要存放的数据作为value。

常用方法:

  • public void set(T t);
  • public T get();
  • public void remove() ;
  • protected T initalValue(); //默认值为null

强引用:普通的引用,强引用指向的对象不会被回收;
软引用:仅有软引用指向的对象,只有发生gc且内存不足,才会被回收;
弱引用:仅有弱引用指向的对象,只要发生gc就会被回收。

一、set 方法
1)、获取当前线程
2)、根据当前线程获取 ThreadLocalMap
3)、如果map为null则进入第4步,否则进入第5步
4)、当map为null,创建一个ThreadLocalMap,用当前ThreadLocal实例作为key(弱引用),将要存放的数据作为value
5)、当map不为null,遍历map,如果发现ThreadLocal相同,则使用新数据替换
6)、在遍历map过程中,如果发现有key为null,则直接将其逐出,并用新的数据占用逐出数据的位置,以防内存泄露
7)、创建新的entry,使用ThreadLocal作为key,存放的数据作为value
8)、根据ThreadLocalMap的当前数据元素的大小和阈值作比较,再次进行key为null的数据清理工作

二、get 方法
1)、获取当前线程
2)、根据当前线程获取 ThreadLocalMap
3)、如果map已经被创建过,则以当前的ThreadLocal作为key获取对应的entry
4)、如果entry不为null,则直接返回entry的value值,否则进入第5步
5)、如果在第2步获取不到map,则执行initalValue()方法获取初始值
6)、根据当前线程获取对应ThreadLocalMap
7)、如果map不为null,则为map指定initalValue()的初始值
8)、如果map为null,则创建一个map
9)、返回initalValue()方法的结果

你可能感兴趣的:(Java)