我的城市沒有海 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也只是一种数据结构

    评论

报告相同问题?

悬赏问题

  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛