我之前没有用nginx的时候 我跟python之间是socket连接
python对我暴露了两个端口,为了线上调试,要求他同时只需要开启任意一个端口就能正常运行, 这里我就得做个端口自动切换
但是这样会有个问题 就是如果两个端口都关闭的话, 切换会无限死循环
所以我就用了ThreadLocal 做一个状态的切换 来保证对于当前线程只切换一次端口
然后用了以后 觉得这东西挺强的, 理论上也可以用来存一些当前请求中比较重要的信息
但是如果用了线程池的话,线程池为了线程的复用 会保留线程的存活,这样的话会不会造成内存泄漏 ?
当时好奇就去看了下ThreadLocal的源码, 发现ThreadLocal实例被ThreadLocalMap实例持有,线程私有。而ThreadLocalMap在选择key的时候,没有直接用ThreadLocal实例,它里面继承了WeakReference类,采用了ThreadLocal实例的弱引用。
弱引用就是在JVM调用GC垃圾回收时,不管还有没有内存,都会被回收掉,跟软引用挺像,软引用是如果内存不够了,就回收掉,适合做一些图片缓存啥的。
ThreadLocal既然是弱引用,那在调用remove方法 或者等线程执行完以后自动释放局部变量,弱引用的变量会直接被回收
所以根本不会出现内存泄漏。