老师,是不是一个ThreadLocal里面只能存一个 long类型的值啊

来源:5-

sam爱java

2018-06-15

老师,是不是一个ThreadLocal里面只能存一个 long类型的值啊,我看源码 好像多次set 会执行覆盖~~ 但是一个线程可以有多个threadLocal

写回答

1回答

Jimin

2018-06-15

你好,先来看一下threadlocal的内部结构图吧
//img.mukewang.com/szimg/5b23d712000111ef15001493.jpg

从上面的结构图,我们已经窥见ThreadLocal的核心机制:
• 每个Thread线程内部都有一个Map。
• Map里面存储线程本地对象(key)和线程的变量副本(value)
• 但是,Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值。
所以对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,于是就形成了副本的隔离,互不干扰。

ThreadLocalMap是ThreadLocal的内部类,没有实现Map接口,用独立的方式实现了Map的功能,Map内部的节点对象Entry也独立实现。

每个ThreadLocal只能保存一个变量副本,如果想要上线一个线程能够保存多个副本以上,就需要创建多个ThreadLocal。

threadlocal里存储的可以是long,也可以是其他对象,同一个线程里不断set会不断覆盖。不同线程间数据互不影响。

1
0

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程