轻松理解ThreadLocal
在多线程下访问共享变量可以通过synchronized、volatile以及lock保证线程线程安全,那么当变量线程私有应该如何操作,答案是用ThreadLocal。
一、定义
ThreadLocal主要用于多线程情况下做线程隔离。
比如玩NDF,当多个玩家同时刷一个图时,每个人都是进自己的,不同的人之间不会相互影响。
二、原理
每个Thread维护了一个ThreadLocalMap类型变量,通过该方法做到线程隔离。
ThreadLocalMap底层数据结构
用图表示为
ThreadLocalMap底层是一个数组,通过开放地址法解决hash冲突。
如何共享ThreadLocal数据?
Thread类中有一个inheritableThreadLocals变量,这个变量可以在子进程创建时共享父进程的数据。
为什么会内存泄漏?如何预防?
由于Entry继承了WeakRefrence,意味着Entry的key是弱引用,当ThreadLocal没有被强引用时,GC会回收Entry中的key。如果创建ThreadLocal的线程一直运行,那么value就有可能一直不会回收。
调用remove方法解决内存泄漏问题。
为什么Entry的key要设计成弱引用?
为了防止内存泄漏