最近在看ThreadLocal的底层实现,通过查看源码发现此类主要的核心是通过获取到当前运行线程的一个变量threadLocals来为每一个线程提供一个本地存储。本人在网上看到很多对ThreadLocal讲解的帖子,一直不是特别理解他们说的副本是什么意思,为什么不会被其他线程干扰,是一个对象的深拷贝吗?但是在ThreadLocal中的set方法中也只是一个this.value=value;所以如果把同一个对象放入不同的两个线程的ThreadLocal中,其中一个线程对该对象的字段进行修改,其实是会影响到另一线程中的对象的。本人测试的结果也是如此。
public class MyThreadLocalTest {
public static void main(String[] args) throws InterruptedException {
ThreadLocal threadLocal = new ThreadLocal();
ThreadLocal threadLocal2 = new ThreadLocal();
Student a = new Student();
threadLocal2.set(a);
a.setName("mainThread");
new Thread((
() -> {
threadLocal.set(a);
((Student) (threadLocal.get())).setName("myThread");
System.out.println("myThread 学生:" + threadLocal.get());
}
)).start();
//这里睡十秒 不然的话有可能主线程先执行
Thread.sleep(10000);
System.out.println("mainThread学生:" + threadLocal2.get());
}
}
本人在网上看到很多帖子以hibernate的session举例,但是本人只能理解到这个threadLocal只能保证到每个线程获取到同一个session对象而已,并不能解决多个线程拿到同一session后如果closs掉以后其他线程的session不被影响,希望大牛给予指点