每日知识点: ThreadLocal

简介: 线程局部变量。每个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的来源

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值