private static ThreadLocal<byte[]> bigData = new ThreadLocal<>();
public void badExample() {
// 存储1MB的数据
bigData.set(new byte[1024 * 1024]);
// 处理业务逻辑...
// 忘记清理!这就是问题所在
// bigData.remove(); // 应该调用这个
}
}
复制代码
不清理会导致的问题:
内存泄漏:数据一直占用内存,无法被回收
线程池污染:下一个任务可能拿到上一个任务的脏数据
系统性能下降:内存越用越多,最终可能导致OutOfMemoryError
用一个生活化的例子理解:
flowchart TD A[员工A使用储物柜] --> B[放入机密文件] B --> C[员工A离职] C --> D{是否清理储物柜} D -->|否| E[新员工B使用同一储物柜] E --> F[看到员工A的机密文件] F --> G[数据泄露] D -->|是| H[储物柜干净] H --> I[新员工B安全使用]正确的使用方式:
public class GoodPractice {
private static ThreadLocal<String> data = new ThreadLocal<>();