threadlocal用法示例,threadlocal最佳实践

  threadlocal用法示例,threadlocal最佳实践

  什么是ThreadLocal?首先,这不是一个线程类。它用于提供本地线程数据,即它保存的数据是线程相关的。每个线程都有数据的副本,并且一个线程可以修改其保存的副本,而不会影响其他线程中的数据。这个不太好理解。对比这三种情况的数据:1。非ThreadLocal类型的静态成员数据;2.非ThreadLocal类型的非静态成员数据;3.ThreadLocal类型的静态数据。在第一种情况下,数据是类类型的,所以这个变量由所有线程共享。在第二种情况下,数据与实例对象相关,实例对象与线程相关。不同线程中实例数据的修改互不影响。虽然第三种类型是静态数据,但它是线程相关的,因为它是通过ThreadLocal保存的。第三类数据和第一类数据的对比可以帮助我们理解ThreadLocal的作用。

  看输出,非静态成员变量(私有或公有)是线程相关的,静态类变量是多线程共享的,静态ThreadLocal对象保存的数据还是线程相关的,每个线程的值都不一样。

  要理解ThreadLocal的实现原理,需要知道ThreadLocalMap类。TThreadLocalMap有一个条目类型数组,每个条目都是ThreadLocal和Object的键值对。数组中的索引是通过ThreadLocal、Object的哈希值与当前数组的长度值减一的AND运算获得的。如果有冲突,以后再找。在ThreadLocalMap类中插入键值对数据的Set方法如下

  每个Thread类型的线程都有一个ThreadLocalMap类型的实例变量ThreadLocales,用于存储与该线程相关的threadlocal变量。看看ThreadLocal保存数据的set方法。代码如下所示

  首先获取当前线程T,通过getMap方法获取当前线程的threadLocals属性映射,然后保存键值对。该对象在保存时作为键使用,在获取数据时也作为键使用,以获取相应的数据。因为一个线程可能有多个由ThreadLocal对象保存的变量,所以这可以用作区分不同ThreadLocal对象的键。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: