我想,ThreadLocal变量是在Thread Local allocation Buffer(s)或TLABs中分配的,对不对?
我没有成功找到任何文件,说明究竟是什么让一些类存储在TLAB中。如果您了解一些,请发布链接。
答案 0 :(得分:7)
我没有成功找到任何文件说明究竟是什么让一些类存储在TLAB中。如果您了解一些,请发布链接。
实际上,你在博客文章中的解释是正确的:
线程本地分配缓冲区(TLAB)是Eden的一个区域,用于由单个线程分配。它使线程能够使用线程本地顶部和限制指针进行对象分配,这比在线程间共享的顶部指针上执行原子操作要快。
每个线程都从自己的Eden块中分配内存,这是堆的“Generation 0”部分。几乎所有东西都存储在TLAB中一段时间 - 很可能也是你的ThreadLocal
- 但是在gen0垃圾收集之后它们会从那里移开。 TLAB可以更快地进行分配,而不是让其他线程无法访问内存。您链接到的同一博客中的更易于访问的说明是A little thread privacy, please。
答案 1 :(得分:2)
没有。它是这样的:
从1.4开始,Java中的每个线程都有一个名为threadLocals
的字段,其中保存了映射。每个threadLocal都有一个结构索引,所以它不使用hashCode()。想象一个数组,每个ThreadLocal都保留一个插槽索引。
当线程死亡和时,没有更多的引用,ThreadLocals是GC'd。很简单的想法。
您可以通过扩展Thread并添加一个字段来保存引用来实现您自己的ThreaLocal。然后将Thread转换为您自己的类并获取数据。
所以它不是TLAB,它仍然像任何其他对象一样堆。
历史上,有静态WeakHashMap的实现,访问数据的速度非常慢。
答案 2 :(得分:2)
据我了解,TLAB用于所有中小型对象的对象分配。您的ThreadLocal将不会以任何不同的方式分配。
答案 3 :(得分:1)
我很确定这取决于JVM实施者的判断。如果需要,他们可以将数据放在TLAB中,或者在由线程ID键入的全局表中。 Java语言规范倾向于对这些问题保持沉默,以便JVM作者可以在尽可能多的平台上部署Java。
答案 4 :(得分:1)
我认为只有指向它的指针是,而数据本身则驻留在其他一些内存区域。请参阅http://blogs.oracle.com/jonthecollector/entry/the_real_thing和http://wikis.sun.com/display/MaxineVM/Threads#Threads-Threadlocalvariables