1.父子线程实现数据共享
父子线程共享数据指的是在父线程中向ThreadLocal中存入了数据可以在子线程中从ThreadLocal中获取到。
public class Demo03 {
public static void main(String[] args) {
// 继承自ThreadLocal,get()方法得到的是父类的值
InheritableThreadLocal<String> threadLocal=new InheritableThreadLocal<String>();
// 主线程存值
threadLocal.set("天王盖地虎");
// 取值
System.out.println("主线程:"+threadLocal.get());
//创建并启动了子线程
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
// 子线程取值
System.out.println("子线程:"+threadLocal.get());
}
});
thread.start();
}
}
InheritableThreadLocal是ThreadLocal的子类,该对象调用get()方法得到的值是父类的值。
2.ThreadLocal避免内存泄露的方式
内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
使用try.catch .finally 在finally中调用remove方法清楚没用的数据,防止数据一直占用内存。
3.应用场景
3.1线程数据隔离
ThreadLocal中的数据只属于当前线程,对其他线程是不可见的,可以有效防止当前线程的数据被其他线程修改。同时,各线程之间的数据相互隔离,避免了加同同步锁带来的性能损失,大大提升了并发性能。
3.2跨函数传递
同一个线程内的数据使用ThreadLocal而不是用返回值和承诺书进行数据传送,降低了耦合度。