对ThreadLocal的一些理解

  • 2019 年 10 月 3 日
  • 筆記

ThreadLocal?????????????????????????????ThreadLocal??????

  • ThreadLocal??????
  • ThreadLocal????
  • ThreadLocal?????

ThreadLocal???????

??ThreadLocal?????????????????????????????????ThreadLocal?ThreadLocal??????????

ThreadLocal?????2????

  • ??????????????????????
  • ???????????????????????????????

??????????????????????

??ThreadLocal????????????????????????????????????????????????

?????????????????????????ThreadLocal??set????????????????????get?????id????????????

????Spring???????ThreadLocal??Connection?????DAO??????Connection????????????????

hreadLocal??????????????????????????????????????????????????

???????????????????????????????

ThreadLocal?????????????????????????ThreadLocal????????????????

?????ThreadLocal???????????????????????ThreadLocal?????????

?????

??????????????????????????????????????????????????????????????????

???????????????

ThreadLocal????

ThreaLocal???????

public class ThreadLocalTest {      private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();        public static void main(String[] args) {            new Thread(() -> {              try {                  for (int i = 0; i < 100; i++) {                      threadLocal.set(i);                      System.out.println(Thread.currentThread().getName() + "====" + threadLocal.get());                      try {                          Thread.sleep(200);                      } catch (InterruptedException e) {                          e.printStackTrace();                      }                  }              } finally {                  threadLocal.remove();              }          }, "threadLocal1").start();              new Thread(() -> {              try {                  for (int i = 0; i < 100; i++) {                      System.out.println(Thread.currentThread().getName() + "====" + threadLocal.get());                      try {                          Thread.sleep(200);                      } catch (InterruptedException e) {                          e.printStackTrace();                      }                  }              } finally {                  threadLocal.remove();              }          }, "threadLocal2").start();      }  }

???????

????????????threadLocal1??set??threadLocal2????????

Thread?ThreadLocalMap?ThreadLocal????

Thread??????threadLocals ????ThreadLocal.ThreadLocalMap????????????????ThreadLocalMap ??????????ThreadLocal??????????????????

??ThreadLocal??????Object???????????Object?????????ThreadLocal

???

??????????????????????Entry?key??ThreadLocal???????? ????????ThreadLocalMap:

java??????? ???????????????? ?

?????????????????

????????????????JVM???????????????????????????????????????

?????ThreadLocalMap??Entry?key??ThreadLocal????ThreadLocal??????

ThreadLocal????????ThreadLocalMap????Entry??????null???Entry???????Entry?????Object?????????????ThreadLocalMap ????????????

ThreadLocal??????

????????????????????????????????

?????????????????ThreadLocal??set??????Object?????set?get???????????????????????ThreadLocal???????????ThreadLocalMap????Entry?????null???????????set?get?????

???????????????????????remove???????

???ThreadLocal???static???????????ThreadLocal?????????ThreadLocalMap????Entry????????????remove????????????????????

??????????

????

try {      // ??????  } finally {      threadLocal??.remove();  }

??

????????????????????????????????????????????????????????????????

??ThreadLocal????Netty??????????FastThreadLocal?xxxxx???????????????????FastThreadLocal?????ThreadLocal????