ThreadLocal类可以看作是当前线程的一个局部变量,只有当前线程可以访问,因此是线程安全的。

ThreadLocal内部维护了一个ThreadLocalMap类,ThreadLocalMap是一个定制的hash map,用于维护ThreadLocal类的value。

首先来看set方法的实现:

public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}

可以看到,set方法时将当前线程对象Thread作为key设置到ThreadLocalMap中去。

首先通过当前线程对象获取到threadLocalMap对象,如果获取到,则更新值,获取失败,则创建并更新值。

我们看看createMap的实现:

void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
} ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
table = new Entry[INITIAL_CAPACITY];
int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
table[i] = new Entry(firstKey, firstValue);
size = 1;
setThreshold(INITIAL_CAPACITY);
}

ThreadLocalMap对象内部维护了一个弱引用的Entry对象,Entry对象使用当前的ThreadLocal对象作为key。

再来看看get方法:

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();
}

还是通过当前线程对象获取到map,然后取出存放在map中的值。

最后,ThreadLocal对象的生命周期是线程的生命周期,它会先线程退出的时候 被销毁,如果希望及时回收设置进ThreadLocal中的对象,可以手动调用ThreadLocal.remove()方法。防止内存泄漏。

最新文章

  1. ASP.NET Web API 创建帮助页
  2. 虚拟机VMWARE上ORACLE License 的计算
  3. Ceph剖析:Paxos算法实现
  4. 【代码笔记】iOS-饼图
  5. [3] 智能指针std::auto_ptr
  6. 手机号码js正则验证
  7. git 本地分支与远程分支关联的一种方法
  8. CSS3的几个标签速记1
  9. Bzoj 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路 最短路,floyd
  10. 如何在VMware虚拟机上安装Linux操作系统(Ubuntu)
  11. Grafana中多租户设置
  12. Java编程思想 - 第11章 持有对象
  13. react-native No bundle URL present
  14. sql存储过程,根据多个条件查询,返回一个dataTable或者DataSet
  15. C#延时函数
  16. malloc 函数详解【转】
  17. 百度api接口_知识积累
  18. streaming优化:禁用序列化
  19. webpack开发和生产两个环境的配置详解
  20. MapReduce Design Patterns(chapter 1)(一)

热门文章

  1. CentOS上安装Git服务器
  2. GitHub入门与实践
  3. [APIO2015]雅加达的摩天楼
  4. Web API 之承载宿主IIS,SelfHost,OwinSelfHost
  5. Unicode字符集,各个语言的区间
  6. qt 如何安装 Debuggers 调试器 ?
  7. CodeForces-747C
  8. React——共享state
  9. Java Enum总结
  10. Ansible自动化运维笔记2(Ansible的组件介绍)