面试官问我 ThreadLocal 为什么这么设计。。。

2022-10-19 10:46:06 +08:00
 asfdsafdas
java 中 Threadlocal 作用是 保证一个线程一直可以持有一些对象,线程独占他吧。那为什么不在 Thread 类中直接写一个 Map 呢?要存东西直接在那个 map 里面存呀!每个线程还不是独占这个内容。为什么还需要 ThreadLocal ?
2622 次点击
所在节点    问与答
12 条回复
AoEiuV020CN
2022-10-19 10:56:38 +08:00
不明白你说的 map ,是指所有线程共用一个 map 然后 thread 当 key 吗?这样共用 map 不就有线程冲突的可能了,不等价吧,
asfdsafdas
2022-10-19 11:08:36 +08:00
@AoEiuV020CN
我的理解大概这个意思
[![xs3w5Q.png]( https://s1.ax1x.com/2022/10/19/xs3w5Q.png)]( https://imgse.com/i/xs3w5Q)
zxCoder
2022-10-19 11:16:53 +08:00
@asfdsafdas 看不出这个线程有什么关系?除了类名
AoEiuV020CN
2022-10-19 11:30:46 +08:00
@asfdsafdas #2 这不就是个普通的对象,拥有一个普通的 map ,看不出来你想设计什么,
enoc
2022-10-19 11:31:13 +08:00
SoloCompany
2022-10-19 13:24:58 +08:00
ThreadLocal 在抽象上的确就是一个 Map 啊 (实际上实现也是), 只不过这个 map 的 key 不是你想象中的 string, 而是 ThreadLocal 定义的变量本身的抽象
xiao109
2022-10-19 13:34:13 +08:00
@enoc 一击必杀,Stack Overflow 真是个好网站,啥刁钻的问题都有解答
bk201
2022-10-19 14:05:51 +08:00
你反问他为什么
xilou31
2022-10-19 14:12:13 +08:00
因为 Thread 类是线程呀,线程这个概念是没有 Map 的。

这应该是叫做面向对象编程设计原则里面的「单一功能原则」?
zoyua
2022-10-19 18:06:13 +08:00
因为 threadlocal 就是这么设计的,你看源码,它就是用 ThreadLocalMap 存的
leonshaw
2022-10-19 18:21:38 +08:00
如何拿到当前线程的 Thread ?—— 把 Thread 对象存到 ThreadLocal 里。
7911364440
2022-10-19 18:36:14 +08:00
在 Thread 类中定义一个 Map 也是没问题的,我觉得正确答案应该就是 5 楼说的,实现 ThreadLocal 的时候还没有 HashMap

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/888037

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX