给当前Thread类对象初始化ThreadlocalMap属性:
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
到这里,我们就可以理解ThreadLocal究竟是如何工作的了
public class Son implements Cloneable{
public static void main(String[] args){
Son p=new Son();
System.out.println(p);
Thread t = new Thread(new Runnable(){
public void run(){
ThreadLocal<Son> threadLocal = new ThreadLocal<>();
System.out.println(threadLocal);
threadLocal.set(p);
System.out.println(threadLocal.get());
threadLocal.remove();
try {
threadLocal.set((Son) p.clone());
System.out.println(threadLocal.get());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
System.out.println(threadLocal);
}});
t.start();
}
}
输出:
Son@7852e922
java.lang.ThreadLocal@3ffc8195
Son@7852e922
Son@313b781a
java.lang.ThreadLocal@3ffc8195
也就是如果把一个共享的对象直接保存到ThreadLocal中,那么多个线程的ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问题。 所以要在保存到ThreadLocal之前,通过克隆或者new来创建新的对象,然后再进行保存。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。