ThreadLocal多线程之间存取数据互不干扰
public class ThreadLocalController {
private static ThreadLocal<List<String>> threadLocal = new ThreadLocal<>();
public void setThreadLocal(List<String> value) {
threadLocal.set(value);
}
public void getThreadLocal() {
threadLocal.get().forEach(name ->{
System.out.println(Thread.currentThread().getName()+"###" + name );
});
//每次使用完最后一定记得remove,多线程容易造成内存泄漏!!
threadLocal.remove();
}
public static void main(String[] args) {
final ThreadLocalController test = new ThreadLocalController();
new Thread(new Runnable() {
@Override
public void run() {
List<String> strs = new ArrayList<String>();
strs.add("1");
strs.add("2");
strs.add("3");
test.setThreadLocal(strs);
test.getThreadLocal();
}
},"t1").start();
new Thread(new Runnable() {
@Override
public void run() {
List<String> strs = new ArrayList<String>();
strs.add("a");
strs.add("b");
test.setThreadLocal(strs);
test.getThreadLocal();
}
},"t2").start();
}
}
输出:
t2###a
t2###b
t1###1
t1###2
t1###3
注意:
ThreadLocal正确的使用方法每次使用完ThreadLocal都调用它的remove()方法清除数据。
将ThreadLocal变量定义成private static,这样就一直存在ThreadLocal的强引用,也就能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值,进而清除掉 。
具体学习上面原理理解参考2