注:以下内容基于Android API Version 27(Android 8.1)Linux Kernel 3.18.0
总结
线程局部存储是用来解决线程对资源的竞争的方式之一,它的思想是将数据和线程关联起来,这份数据只有在当前线程的整个调用栈中时可见的,在其他线程不可见。线程局部存储的数据可以认为是线程私有数据,线程各用各的数据也就不存在竞争问题了。
线程局部存储还有另一个作用是在整个线程的调用栈中共享同一个变量,这样就免去了调用栈中所有函数都声明同一个参数的烦恼。
在Java层线程局部存储是借助ThreadLocal
类实现的,在Native层是借助pthread_key_create/pthread_setspecific/pthread_getspecific
三个函数实现的。
无论是Java层还是Native能,线程局部存储的本质原理是相似的,可以简单归纳为:使用一个map保存所有线程的局部数据,map的key是线程的id,value就是所要存储的数据。所以线程局部存储背后并没有什么魔法,你可以以任何方式实现线程局部存储,只要保证通过线程ID能找到关联在线程ID上的数据就行。
当然上面说的都是动态的线程局部存储,如果是在编译期间就确定的静态线程局部存储就有点不同了。具体可以参考这篇文章:A Deep dive into (implicit) Thread Local Storage