Threadlocal

ThreadLocal,即线程本地变量。如果你创了一个 ThreadLocal 变量,那么访问这个变量每个线程都会有这个变量一个本地拷贝,多个线程操作这个变量时候,实际操作自己本地内存里面变量,从而起到线程隔离作用,避免了线程安全问题。

原理:

  • Thread 类有一个类型为 ThreadLocal.ThreadLocalMap 实例变量threadLocals,即每个线程都有一个属于自己 ThreadLocalMap。
  • ThreadLocalMap 内部维护着 Entry 数组,每个Entry 代表一个完整对象, key  为ThreadLocal 本身,value 为ThreadLocal 泛型值。
  • 每个线程在往 ThreadLocal 里设置值时候,都往自己ThreadLocalMap 里存,读也以某个 ThreadLocal 作为引用,在自己 map 里找对应 key,从而实现了线程隔离。

内存泄漏问题:

ThreadLocalMap里的entry数组持有的key全是弱引用,弱引用只要垃圾回收机制一运行,不管 JVM 内存空间否充足,都会回收该对象占用内存。

如何解决:使用完之后尽量使用remove移除释放当前引用所占的空间。其实说白了就是个弱引用队列出队的过程。

使用场景:数据库连池,会话管理中使用。

你可能感兴趣的:(JAVA基础,java多线程,java)