Android 线程局部存储ThreadLocal原理总结

注:如下内容基于Android API Version 27(Android 8.1)Linux Kernel 3.18.0git

总结

线程局部存储是用来解决线程对资源的竞争的方式之一,它的思想是将数据和线程关联起来,这份数据只有在当前线程的整个调用栈中时可见的,在其余线程不可见。线程局部存储的数据能够认为是线程私有数据,线程各用各的数据也就不存在竞争问题了。github

线程局部存储还有另外一个做用是在整个线程的调用栈中共享同一个变量,这样就免去了调用栈中全部函数都声明同一个参数的烦恼。函数

在Java层线程局部存储是借助ThreadLocal类实现的,在Native层是借助pthread_key_create/pthread_setspecific/pthread_getspecific三个函数实现的。线程

不管是Java层仍是Native能,线程局部存储的本质原理是类似的,能够简单概括为:使用一个map保存全部线程的局部数据,map的key是线程的id,value就是所要存储的数据。因此线程局部存储背后并无什么魔法,你能够以任何方式实现线程局部存储,只要保证经过线程ID能找到关联在线程ID上的数据就行。code

固然上面说的都是动态的线程局部存储,若是是在编译期间就肯定的静态线程局部存储就有点不一样了。具体能够参考这篇文章:A Deep dive into (implicit) Thread Local Storagecdn

相关文章
相关标签/搜索