https://www.imooc.com/article/34602
ThreadLocal是用来提供线程内部的局部变量,他可以在多线程访问的情况下保证各个线程的变量独立于其他的线程,在当前线程随时随地可以获取。它是一种用空间处理并发的解决方式。(锁是用时间处理)
实现原理是一个跟线程绑定的Map,ThreadLocalMap,他的key是ThreadLocal对象本身,value是存的值。这样设计有一下几点好处:
1、 可以让每个Map的entry数量变少,由treadlocal对象数量决定。
2、 可以在线程结束的时候销毁,节省内存。
他的set,get,remove方法在最后都会清除key是null的entry,防止内存泄露。
Entry继承了WeakReference,当ThreadLocal被释放的时候,ThreadLocal会被回收,Entry的key变为null,在下一次get,set的时候删除,但是如果使用static的ThreadLocal,延长了ThreadLocal的生命周期,还是可能导致的内存泄漏。所以需要合理使用。
在使用线程池的情况下,没有及时清理ThreadLocal,不仅是内存泄漏的问题,更严重的是可能导致业务逻辑出现问题。所以,使用ThreadLocal就跟加锁完要解锁一样,用完就清理。
网友评论