入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

Java面试题 ThreadLocal

创建时间:2018-01-24 投稿人: 你开心就好 浏览次数:273

只要涉及到多线程,就必然要考虑变量的线程安全。有一种全局变量,多个线程都会对其进行操作,为其安全性我们可以采取synchronized、volatile等方式来处理。

还有一种局部变量,它只存活于线程内部,供线程内的函数使用,与其他线程无关,这就要用ThreadLocal。

Java面试题 ThreadLocal

线程类

Java面试题 ThreadLocal

测试类

Java面试题 ThreadLocal

结果

各个线程内的ThreadLocal变量是相互独立的,互不干扰。

实现方案1

在每一个ThreadLocal类中构建一个Map,以线程ID为Key,具体的值为Value。如图:

Java面试题 ThreadLocal

A

JDK早期的实现是如此。

实现方案2

每个Thread维护一个ThreadLocalMap,ThreadLocal为Key,具体的值为Value。如图:

Java面试题 ThreadLocal

B

这样做好处有:

  1. 原来要维护一个大Map,有多少个线程,Map里就要有多少个键值对。比如我们有3个ThreadLocal变量,10个线程,如果要获取数据,就要在一个有10个键值对的Map里查找。

    现在则是在10个线程里,维护一个只有3个键值对的Map,查找就快了。

  2. Thread运行完毕,销毁后,内部的ThreadLocalMap也会一起销毁,节省内存。

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。