1.ThreadLocal是什么?
简单来说,ThreadLocal是Java的一个特殊的类,提供本地线程变量(为每个线程创建一个变量的副本),使得每个线程都有自己单独的变量副本,一定程度上解决了线程安全的问题。
2.为什么需要ThreadLocal?
设计ThreadLocal的目的:为了使多个线程能同时访问一个变量(这个变量会被保存为副本拷贝给每个线程),而访问的同时需要保证线程安全。
注:ThreadLocal不是用来解决对象共享访问问题的,而主要是提供了保持对象的方法和避免参数传递的方便的对象访问方式。
3.使用ThreadLocal的优劣势
优点:当有了ThreadLocal类,我们就能通过变量副本极大地提升程序的性能,因为我们不用再去考虑编写保证线程安全的代码,只需关心具体业务逻辑的实现。
缺点:ThreadLocal是典型的以空间换时间的方式,每多一个副本就会多消耗内存空间,所以不适合有大量副本需求的应用场景。
4.ThreadLocal的实现原理
每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象。
通过ThreadLocal保存的数据最终保存在ThreadLocalMap类的threadLocals变量中。ThreadLocalMap是一个Map结构,其中key为我们声明的ThreadLocal对象,value为我们使用ThreadLocal保存的线程本地变量。通过set,get方法存储变量和移除变量。
5.ThreadLocal的应用场景
ThreadLocal适用于全局的设计上,比如当面对多次获取的是同一个对象,并且可以被其他线程访问,就适合用ThreadLocal。还有对线程多实例的情况(每个线程对应一个实例)的对象的访问,并且这个对象很多地方都要用到。