并发工具类之ThreadLocal——小结

ThreadLocal

使用场景

每个线程需要一个独享的对象,通常是个工具类
每个线程内需要保存全局变量,可让不同方法使用,避免传参的麻烦

使用Thread的好处

  • 达到线程安全
  • 不需要加锁,提高执行效率
  • 更高效地利用内存,节省开销
  • 免去传参的繁琐

Thread原理

每个ThreadLocal对象中都有一个ThreadLocalMap成员变量
并发工具类之ThreadLocal——小结

主要方法

  • InitialValue()

  • 返回当前线程对应的初始值,延迟加载,只有在调用了get()才会触发

  • 除非线程先前调用了set方法,在这种情况下,不会为线程调用initalvalue方法

  • 通常每个线程最多调用一次这个方法,如果调用了remove(),在get(),才会再次调用

  • get()

  • remove()

使用注意

  • 内存泄漏:当某个对象不再使用,但占用的内存却不能回收
     1.key是弱引用(继承),会被gc回收掉
     2.而value = v;这种则是强引用,正常情况下,当线程终止,保存在threadlocal里的value会被gc
     3.如果线程一直不终止(线程池),那么key对应的value就不能回收
     4.jdk已考虑到这种情况,在set,remove,rehash方法里会扫描key为null的Entry,并把对应的value设置为null

  • 保存的map和map中的key和value是保存在Thread类中的


如何避免?阿里规约

使用完threadlocal后,调用remove方法