ThreadLocal与InheritableThreadLocal
ThreadLocal底层是个map每次set值的时候把当前线程与值放到里面
ThreadLocal.ThreadLocalMap threadLocals = null;


这种结构在大数据量并发请求时会,会产生内存泄漏。 请求时set进去,正常退出move掉,来不及remove的数据会停留在内存中,外界还有引用,gc不会收就会泄露
如果子线程需要使用父级的数据去处理任务,然后回到父线程归纳处理,这时候ThreadLocal就不满足了
private static ThreadLocal<String> inheritableThreadLocal = new ThreadLocal<>();
public static void main(String[] args) throws IOException {
inheritableThreadLocal.set("Value from parent thread");
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(5);
// 提交任务(创建子线程)
for (int i = 0; i < 5; i++) {
executorService.submit(
() -> {
try {
// 子线程中获取从父线程继承的值
String value = (String) inheritableThreadLocal.get();
System.out.println("Value in child thread: " + value);
} finally {
// 任务执行完毕后清除值
inheritableThreadLocal.remove();
}
});
}
// 关闭线程池
executorService.shutdown();
}
这时候子线程获取父级线程的数据就是空

InheritableThreadLocal是ThreadLocal子类,其区别
private static InheritableThreadLocal<String> inheritableThreadLocal = new InheritableThreadLocal<>();
public static void main(String[] args) throws IOException {
inheritableThreadLocal.set("Value from parent thread");
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(5);
// 提交任务(创建子线程)
for (int i = 0; i < 5; i++) {
executorService.submit(
() -> {
try {
// 子线程中获取从父线程继承的值
String value = (String) inheritableThreadLocal.get();
System.out.println("Value in child thread: " + value);
} finally {
// 任务执行完毕后清除值
inheritableThreadLocal.remove();
}
});
}
// 关闭线程池
executorService.shutdown();
}
inheritableThreadLocal.set("Value from parent thread");设置值时




把父级的inheritableThreadLocals复制给子集的inheritableThreadLocals,

效果如下

本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/18630825

浙公网安备 33010602011771号