ThreadLocal为什么能实现线程数据隔离
ThreadLocal的get()和set()方法会访问当前线程的ThreadLocalMap每个线程都有自己独立的ThreadLocalMap实例。这个映射表以ThreadLocal实例this作为键与线程特定的值value相关联因此每个线程既使通过同一个ThreadLocal实例存取值但也是线程隔离的。这一点可以通过ThreadLocal的源码来进一步理解。在ThreadLocal类中每个线程的ThreadLocalMap是作为Thread类的一个字段存在的。当你对ThreadLocal进行get()或set()操作时它会先获取当前线程Thread.currentThread()然后在当前线程对象内部查找或修改ThreadLocalMap。源码示例public class ThreadLocalT { public T get() { Thread t Thread.currentThread(); ThreadLocalMap map getMap(t); if (map ! null) { ThreadLocalMap.Entry e map.getEntry(this); if (e ! null) { SuppressWarnings(unchecked) T result (T)e.value; return result; } } return setInitialValue(); } // 其他方法... }在上面的get()方法示例中this代表当前ThreadLocal实例作为映射的键但是由于getMap(t)获取的是当前线程的ThreadLocalMap所以不同线程看到的映射实际上是不同的。因此关键点在于虽然ThreadLocal实例是共享的但是每个线程都有自己的ThreadLocalMap所以它们保存的值是独立隔离的。这就是ThreadLocal为何能在多线程环境中保持线程局部变量独立性的原理。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2416017.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!