写完这篇我再也不用CSDN了
接近007的工作制度让我没有自己的时间做自己的事。更别提自己建个博客网站了。。。唉。
正文
天呐,在这家公司写CRUD写的我都忘了ThreadLocal实现原理了(DougLea是不是要气死)。
今天好不容易有个假期,来复习一下吧。
这个例子没测试过,我是随便写了个示范供自己记忆。
public class ThreadLocalMemoryLeak {
private static final ThreadLocal<byte[]> THREAD_LOCAL = ThreadLocal.withInitial(() -> new byte[1024 * 1024 * 1024]);
public static void main(String[] args) throws InterruptedException {
//java.lang.ThreadLocal的实现是在Thread.currentThread()对象里建立一个Map赋值到Thread.threadLocals字段。
//其中K是THREAD_LOCAL的地址,V是THREAD_LOCAL.get()的值
//K是弱引用但V不是,所以即便THREAD_LOCAL对象已经被GC回收,Thread对象里的threadLocals里K所对应的V也不会被回收
//另外顺便提一嘴,ThreadLocal.ThreadLocalMap的实现类似HashMap,解决hash冲突用的寻址法,所以ThreadLocal多的情况可能会很慢,推荐使用Netty实现的fastthreadlocal
for (int i = 0; i < 500; i++) {
new Thread(THREAD_LOCAL::get).start();
}
}
}