ThreadLocal学习总结

140 阅读2分钟

ThreadLocal

ThreadLocal的作用:

  • 线程并发
  • 数据传递
  • 线程隔离

主要的方法有:

  • set
  • get
  • remove
  • intitialValue

ThreadLocal的应用场景有:

可以用于并发访问数据库获取connection对象的时候,每个connection对象就是一个数据库对象,而每次进来一个链接都要获取一个新的connection对象,并且service层和dao层必须保证用的是同一个对象,这个时候每个线程就可以用threadlocal绑定一个connection对象

ThreadLocal和Synchronized的区别:

  1. ThreadLocal是空间换时间,可以使并发性更高。

  2. Synchronized性能低,线程只能排队对资源进行访问,以时间换空间。

ThreadLocal底层

现在threadLocal的设计是,每个线程绑定一个ThreadLocalMap对象,该对象存储的是一个entry数组,每个entry的key存的是threadlocal对象,值存的是threadlocal要存的值,这样做的好处是当thread销毁时,threadlocalmap也会被回收

ThreadLocalMap

ThreadLocalMap是ThreadLocal的的一个内部类,并没有实现map接口,用独立的方式实现了map的功能,其内部的entry也是独立实现的,并且entry继承于weakReference,entry的key只能是threadLocal对象,并且key是弱引用

弱引用:垃圾回收器一旦发现弱引用的对象,不管内存是否足够都会将其回收

解释一下使用弱引用的理由: 此时假设ThreadLoca Ref已经使用完被回收了 但是由于threadRef还在运行,此时entry不会被删除,则导致threadlocal也不会被回收。

如果使用的是弱引用则 threadlocal会被回收并且key的值为null,为了保证能够将内存清空,对threadlocal的set,remove,get等方法遇到这些key为null的entry时会将他们的value释放掉,相当于对内存做了释放。

by the way。threadlocalmap使用线性探测法解决hash冲突