寫完這篇我再也不用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();
}
}
}