ThreadLocal是每个线程的“独有”空间,可以存放线程的独有变量。
如下例,分别使用ThreadLocal和ArrayList存储两个线程的变量:
import java.util.ArrayList;
import java.util.List;
public class ThreadLocalDemo
{
static ThreadLocal<List<String>> threadLocal = new ThreadLocal<>();
static ArrayList<List<String>> list = new ArrayList<>();
public static void main(String[] args)
throws InterruptedException
{
new Thread(new Runnable(){
@Override
public void run()
{
List<String> value1 = new ArrayList<>();
value1.add("test1");
value1.add("name1");
threadLocal.set(value1);
System.out.println("threadLocal: " + threadLocal.get());
list.add(value1);
System.out.println("arrayList: " + list);
}
}).start();
Thread.sleep(2000);
new Thread(new Runnable(){
@Override
public void run()
{
List<String> value2 = new ArrayList<>();
value2.add("test2");
value2.add("name2");
threadLocal.set(value2);
System.out.println("threadLocal: " + threadLocal.get());
list.add(value2);
System.out.println("arrayList: " + list);
}
}).start();
}
}
得到结果:
threadLocal: [test1, name1]
arrayList: [[test1, name1]]
threadLocal: [test2, name2]
arrayList: [[test1, name1], [test2, name2]]
对比可以发现,ArrayList对象,多个线程同时存数据,读取的时候,之后的线程能够读取到前面所有线程存储的数据,
而ThreadLocal对象,为线程保存了各自的数据。
ThreadLocal方法采用的是空间换取时间的方法,内部用一个ThreadLocalMap为每个线程的存储一份数据,key值为该线程对象,value为线程对应的数据。
本文探讨了Java中的ThreadLocal特性,它为每个线程提供独立的变量副本,确保线程间数据隔离。通过对比ThreadLocal与ArrayList在多线程环境中的表现,突显ThreadLocal如何通过牺牲内存来优化性能,实现线程局部变量的存储。

2110

被折叠的 条评论
为什么被折叠?



