1.是什么?
ThreadLocal
是线程的局部变量,是每一个线程所单独持有的,其他线程不能对其访问,这就是ThreadLocal
命名的来源。
2.有什么用?
我们知道有时候一个对象可以被多个线程访问,这是就会有线程安全问题,当然我们可以用Synchorinized
对此变量进行加锁,但是这就极大地影响效率,可以用ThreadLocal来解决某一变量的访问。
Threadlocal
适用于每个线程需要自己的实例,且实例需要多个方法被使用,即变量在线程间隔离而在方法和类中共享。
- 储存用户的session
- 解决线程安全的问题
3.原理是什么?
ThreadLocal
这个是泛型类,可以接受任何类型的对象。
因为一个线程可以维护多个ThreadLocal
对象,所以其实ThreadLocal
内部维护了一个map,这个map不是直接使用HashMap,ThreadLocal
实现了一个ThreadLocalMap
的静态内部类,我们使用的set()``get()
这些方法都是ThreadLocalMap
的方法
4.怎么使用?
共计3个方法set()
,get()
,remove()
5.有什么需要注意的?
实际上ThreadLocalMap
中的key
使用的是ThreadLocal
的弱引用,弱引用的特点是如果这个对象只存在弱引用,则下次的垃圾回收时将会被清理掉。但是ThreadLocalMap
的value
为强引用,不会被清理。这样就会出现key
为null
的value
。
存在内存泄露问题,每次使用完ThreadLocal
,都调用它的remove()
方法,清除数据