前言

TheadLocal主要用于将似有线程和该线程存放的副本对象做一个映射,是的线程之间互不影响。
它为当前执行线程提供了一个副本,用于保存对象。使得线程之间都互不干扰。

结构

image.png
图片来自于参考链接

  • 每个Thread内部都有一个Map
  • Map里面存储线程本地对象(key)和线程的变量副本(value)

    使用

    1. private static class NameHolder {
    2. public static ThreadLocal<String> LOCAL = new ThreadLocal<>();
    3. public static void set(String name) {
    4. LOCAL.set(name);
    5. }
    6. public static String get() {
    7. return LOCAL.get();
    8. }
    9. public static void remove() {
    10. LOCAL.remove();
    11. }
    12. }

    建议:

  1. 尽量采取一个单独的类来保存TheadLocal
  2. 使用public static 进行修饰。

源码

TheadLocal 保存来自于Thead对象。

  1. public class Thread implements Runnable {
  2. ThreadLocal.ThreadLocalMap threadLocals = null;
  3. }

TheadLocal核心主要有get、set、remove方法。

  1. public class ThreadLocal<T> {
  2. public T get() {
  3. Thread t = Thread.currentThread();
  4. ThreadLocalMap map = getMap(t);
  5. if (map != null) {
  6. ThreadLocalMap.Entry e = map.getEntry(this);
  7. if (e != null) {
  8. @SuppressWarnings("unchecked")
  9. T result = (T)e.value;
  10. return result;
  11. }
  12. }
  13. return setInitialValue();
  14. }
  15. public void set(T value) {
  16. Thread t = Thread.currentThread();
  17. ThreadLocalMap map = getMap(t);
  18. if (map != null)
  19. map.set(this, value);
  20. else
  21. createMap(t, value);
  22. }
  23. public void remove() {
  24. ThreadLocalMap m = getMap(Thread.currentThread());
  25. if (m != null)
  26. m.remove(this);
  27. }
  28. }

参考