ThreadLocal浅析

1、背景

在使用我们的ToolBox(我们公司的数据分析平台) 在往greenplum使用goload 入数据的时候出现了数据错乱的问题,后来定位问题发现SimpledateFormat在多线程下是线程不安全的,刚开始我用匿名对象去解决这个问题,后来发现还是用ThreadLocal去解决才能提高效率,而且能保证安全

2、ThreadLocal作用

ThreadLocal提供了线程的局部变量,每个线程都可以通过set()和get()来对这个局部变量进行操作,但不会和其他线程的局部变量进行冲突,实现了线程的数据隔离。

3、ThreadLocal为什么会内存泄漏

ThreadLocalMap的key为ThreadLocal实例,他是一个弱引用,我们知道弱引用有利于GC的回收,当key == null时,GC就会回收这部分空间,但value不一定能被回收,因为他和Current Thread之间还存在一个强引用的关系。由于这个强引用的关系,会导致value无法回收,如果线程对象不消除这个强引用的关系,就可能会出现OOM。有些时候,我们调用ThreadLocalMap的remove()方法进行显式处理。

4、总结

1、每个Thread维护着一个ThreadLocalMap的引用
2、ThreadLocalMap是ThreadLocal的内部类,用Entry来进行存储
3、调用ThreadLocal的set()方法时,实际上就是往ThreadLocalMap设置值,key是ThreadLocal对象,值是传递进来的对象
4、调用ThreadLocal的get()方法时,实际上就是往ThreadLocalMap获取值,key是ThreadLocal对象
5、ThreadLocal本身并不存储值,它只是作为一个key来让线程从ThreadLocalMap获取value。

参考资料:https://juejin.im/post/5ac2eb52518825555e5e06ee

你可能感兴趣的:(ThreadLocal浅析)