我的城市沒有海 2019-06-03 11:16 采纳率: 0%
浏览 417

关于threadLocal的疑惑

最近在看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不被影响,希望大牛给予指点

  • 写回答

3条回答 默认 最新

  • ꧁gaoKuo꧂ 2019-06-03 11:56
    关注

    不知道你最后一段话再说什么
    threadLocal引用相同改变一个其他的自然会改变 应用内存是共享的(堆就那样 跟线程无关) threadLocal也只是一种数据结构

    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮