为什么 ThreadLocal 创建的是变量副本,独属于该线程。

JavaRecorder 2016-09-22 09:13:00
我的理解 明明就是一个引用传递啊,各种资料查了两天,还是百思不得其解,
...全文
1229 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
amita_lotus 2018-12-04
  • 打赏
  • 举报
回复
ThreadLocal存的是各个线程私有的对象,并不是说各个线程共享一个对象,在类中定义一个ThreadLocal对象,每个线程都要对这个对象进行显示赋值,否则获取的只能是NULL,各线程之间的值不影响
休息的风 2016-10-25
  • 打赏
  • 举报
回复
其实这个问题,如果你懂java的内存模型,这个问题就很好理解的。建议可以看看java并发编程艺术。
LittleLeeZi 2016-10-22
  • 打赏
  • 举报
回复
楼主理解通了就发出来分享下,这样很不好
gintamaz 2016-10-17
  • 打赏
  • 举报
回复
楼主最后是怎么理解通的,求解,谢谢,。
wojiaohuiliang 2016-09-28
  • 打赏
  • 举报
回复
我来看看~呵呵呵
dzq584462393 2016-09-28
  • 打赏
  • 举报
回复
引用 6 楼 u014313064 的回复:
[quote=引用 3 楼 dzq584462393 的回复:] [quote=引用 2 楼 u014313064 的回复:] [quote=引用 1 楼 dzq584462393 的回复:] ThreadLocal 你创建的时候,其实是在你本线程的变量ThreadLocalMap的一个变量,以你的ThreadLocal当key

public void set(T value) {
        Thread t = Thread.currentThread();  //得到当前线程
        ThreadLocalMap map = getMap(t);  //根据当前线程以ThreadLocal当key获取存储值
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }
get方法你可以自行查看源码
不对吧,是每个线程都有个map,map中的key是该线程,value是这个对象。 我不明白的是,这个对象是怎样独立到线程中了,我看源码明明是个引用传递来着。[/quote]

ThreadLocalMap getMap(Thread t) {   //上面的getMap方法
        return t.threadLocals;                     //返回线程的ThreadLocalMap
    }

 map.set(this, value);                            //ThreadLocalMap的set方法把this当做key,this就是ThreadLocal
[/quote] 您发个这是想解释什么呢?没有任何帮助啊。源码我也看过。[/quote] 你说你看过源码,但是是怎么看的呢,是一行一行看的,还是只是把代码看了一遍而已,第一句话理解了吗? 如果你看过源码,怎么会不知道我解释的是什么呢? 我解释的东西不是有备注?你仔细看下,然后如果没看懂的话,我建议源码你一行一行理解
JavaRecorder 2016-09-28
  • 打赏
  • 举报
回复
引用 16 楼 wojiaohuiliang 的回复:
我来看看~呵呵呵
谢谢谢谢谢谢各位,我自己理解有误。已经懂了。
  • 打赏
  • 举报
回复
不是副本 点击
JavaRecorder 2016-09-26
  • 打赏
  • 举报
回复
引用 7 楼 leetao881212 的回复:
每个thread对象有一个叫做ThreadLocalMap的实例变量。ThreadLocal 只是ThreadLocalMap的线程封装。 因此,每次ThreadLocal的操作其实就是操作当前所在线程thread对象中的ThreadLocalMap,这样只要是通过threadLocal进行的操作,就只是操作在各自线程内部的对象。 关键点在于"每个thread对象有一个叫做ThreadLocalMap的实例变量",自然而然就是独立的吧
能不能这样理解。所有线程操作的都是同一个对象,只不过当前线程,看不到别的线程的操作?
leetao881212 2016-09-26
  • 打赏
  • 举报
回复
每个thread对象有一个叫做ThreadLocalMap的实例变量。ThreadLocal 只是ThreadLocalMap的线程封装。 因此,每次ThreadLocal的操作其实就是操作当前所在线程thread对象中的ThreadLocalMap,这样只要是通过threadLocal进行的操作,就只是操作在各自线程内部的对象。 关键点在于"每个thread对象有一个叫做ThreadLocalMap的实例变量",自然而然就是独立的吧
JavaRecorder 2016-09-26
  • 打赏
  • 举报
回复
引用 3 楼 dzq584462393 的回复:
[quote=引用 2 楼 u014313064 的回复:] [quote=引用 1 楼 dzq584462393 的回复:] ThreadLocal 你创建的时候,其实是在你本线程的变量ThreadLocalMap的一个变量,以你的ThreadLocal当key

public void set(T value) {
        Thread t = Thread.currentThread();  //得到当前线程
        ThreadLocalMap map = getMap(t);  //根据当前线程以ThreadLocal当key获取存储值
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }
get方法你可以自行查看源码
不对吧,是每个线程都有个map,map中的key是该线程,value是这个对象。 我不明白的是,这个对象是怎样独立到线程中了,我看源码明明是个引用传递来着。[/quote]

ThreadLocalMap getMap(Thread t) {   //上面的getMap方法
        return t.threadLocals;                     //返回线程的ThreadLocalMap
    }

 map.set(this, value);                            //ThreadLocalMap的set方法把this当做key,this就是ThreadLocal
[/quote] 您发个这是想解释什么呢?没有任何帮助啊。源码我也看过。
JavaRecorder 2016-09-26
  • 打赏
  • 举报
回复
引用 4 楼 xiaofanac66 的回复:
看源码比在这问强,很明显每个Thread都有一份自己的map这个map存放的key就是threadLocal对象的引用,value就是实际值。 为什么 ThreadLocal 创建的是变量副本,独属于该线程。 自己看源码。
您说的好像我没看一样。就是看了有疑问才问的。不看我也不会反对上楼的解释。
JavaRecorder 2016-09-26
  • 打赏
  • 举报
回复
是我提的问题太难了?还是太简单,简单到不屑一顾?
JavaRecorder 2016-09-26
  • 打赏
  • 举报
回复
引用 12 楼 u012943783 的回复:
先看看这个问题 threadLocal 翻译下 java 有好多就字面意思就给你表述清楚了 new String 为什么是String 你这问题你还要纠结吗
你的意思是明白这么用就行了,不必纠结于为什么是这样子?
拘谨的小人 2016-09-26
  • 打赏
  • 举报
回复
先看看这个问题 threadLocal 翻译下 java 有好多就字面意思就给你表述清楚了 new String 为什么是String 你这问题你还要纠结吗
JavaRecorder 2016-09-26
  • 打赏
  • 举报
回复
各位不要看到问题就搞一大段上来。很多都是理解的,只是某某一小点不理解。还请针对性的解决问题。谢谢各位大神了。
JavaRecorder 2016-09-26
  • 打赏
  • 举报
回复
引用 9 楼 abcdefghiijklmnopqrs 的回复:
不是副本 点击
浏览了一遍,文章开头说 set 进去的那个对象是 new 的,每个线程创建一个,这句话在代码中哪里有体现??
xiaofanac66 2016-09-23
  • 打赏
  • 举报
回复
看源码比在这问强,很明显每个Thread都有一份自己的map这个map存放的key就是threadLocal对象的引用,value就是实际值。 为什么 ThreadLocal 创建的是变量副本,独属于该线程。 自己看源码。
dzq584462393 2016-09-22
  • 打赏
  • 举报
回复
引用 2 楼 u014313064 的回复:
[quote=引用 1 楼 dzq584462393 的回复:] ThreadLocal 你创建的时候,其实是在你本线程的变量ThreadLocalMap的一个变量,以你的ThreadLocal当key

public void set(T value) {
        Thread t = Thread.currentThread();  //得到当前线程
        ThreadLocalMap map = getMap(t);  //根据当前线程以ThreadLocal当key获取存储值
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }
get方法你可以自行查看源码
不对吧,是每个线程都有个map,map中的key是该线程,value是这个对象。 我不明白的是,这个对象是怎样独立到线程中了,我看源码明明是个引用传递来着。[/quote]

ThreadLocalMap getMap(Thread t) {   //上面的getMap方法
        return t.threadLocals;                     //返回线程的ThreadLocalMap
    }

 map.set(this, value);                            //ThreadLocalMap的set方法把this当做key,this就是ThreadLocal
JavaRecorder 2016-09-22
  • 打赏
  • 举报
回复
引用 1 楼 dzq584462393 的回复:
ThreadLocal 你创建的时候,其实是在你本线程的变量ThreadLocalMap的一个变量,以你的ThreadLocal当key

public void set(T value) {
        Thread t = Thread.currentThread();  //得到当前线程
        ThreadLocalMap map = getMap(t);  //根据当前线程以ThreadLocal当key获取存储值
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }
get方法你可以自行查看源码
不对吧,是每个线程都有个map,map中的key是该线程,value是这个对象。 我不明白的是,这个对象是怎样独立到线程中了,我看源码明明是个引用传递来着。
加载更多回复(1)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧