ThreadLocal
ThreadLocal的作用:
- 线程并发
- 数据传递
- 线程隔离
主要的方法有:
- set
- get
- remove
- intitialValue
ThreadLocal的应用场景有:
可以用于并发访问数据库获取connection对象的时候,每个connection对象就是一个数据库对象,而每次进来一个链接都要获取一个新的connection对象,并且service层和dao层必须保证用的是同一个对象,这个时候每个线程就可以用threadlocal绑定一个connection对象
ThreadLocal和Synchronized的区别:
-
ThreadLocal是空间换时间,可以使并发性更高。
-
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冲突