轻松理解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要设计成弱引用?

为了防止内存泄漏

posted @ 2021-03-16 17:51  落雨有清·风  阅读(21)  评论(0编辑  收藏  举报