简介: 线程局部变量。每个ThreadLocal对象都可以维护一个线程私有的变量副本,这意味着每个线程都可以独立地访问和修改自己的变量副本,而不会影响其他线程的副本
作用: ThreadLocal为多线程环境下的共享对象提供线程安全的访问方式,避免了线程间的数据竞争和同步问题
原理:ThreadLocalMap是线程的一个属性,因此可以将线程自己的对象保持到其中,从而实现线程可以正确的访问到自己的对象。ThreadLocal存入值时使用ThreadLocal实例作为key,存入当前线程对象中的ThreadLocalMap 中去
public class ThreadLocalDemo {
// 定义并初始化线程池
private static final ThreadLocal<Map<String, Integer>> mapThreadLocal = ThreadLocal.withInitial(HashMap::new);
// 通过get方法获取当前线程的变量副本
public static Map<String, Integer> get(){
return mapThreadLocal.get();
}
// 通过put方法修改当前线程的变量副本
public static void put(String key, int value){
Map<String, Integer> map = mapThreadLocal.get();
map.put(key, value);
}
// 通过clear方法显式清除无用的变量副本
public static void clean() {
mapThreadLocal.remove();
}
}
public class ThreadLocalTest {
public static void main(String[] args) {
new Thread(() -> {
ThreadLocalDemo.put("lilei", 24);
System.out.println(ThreadLocalDemo.get());
}).start();
new Thread(() -> {
ThreadLocalDemo.put("hanbakun", 24);
System.out.println(ThreadLocalDemo.get());
}).start();
new Thread(() -> {
ThreadLocalDemo.put("libai", 88);
ThreadLocalDemo.clean();
System.out.println(ThreadLocalDemo.get());
}).start();
}
}
ThreadLocal问题事项:ThreadLocalMap中的key是弱引用,通常弱引用都会和引用队列配合清理机制使用,但ThreadLocal是个例外。这意味着废弃对象的回收依赖于显式的触发,否则就要等待线程结束才会回收相应的ThreadLocalMap,这就是很多OOM的来源