Java:ThreadLocal

本文详细介绍了线程局部变量的概念,其主要作用是保存线程独享的资源,避免了线程间的资源共享问题。通过具体代码示例展示了如何在多线程环境中使用ThreadLocal类来实现线程局部变量,确保每个线程拥有独立的数据副本,从而提高程序的并发性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定义
  1. 定义:线程局部变量
2.作用
  1. 保存线程独享的资源。
3.具体使用
public class ThreadLocalDemo {

    public static void main(String[] args) {
    
        ThreadLocal<String> threadLocal = new ThreadLocal<>();

        new Thread(new Runnable() {
            @Override
            public void run() {
                threadLocal.set("线程名:" + Thread.currentThread().getName());
                System.out.println(threadLocal.get());
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                threadLocal.set("线程名:" + Thread.currentThread().getName());
                System.out.println(threadLocal.get());
            }
        }).start();
    }
}
4.源码解析

保证线程安全:空间换时间。

  1. 每个线程都有自己的 ThreadLocalMap 对象。
  2. ThreadLocalMap 的 key = ThreadLocal 实例,value = 线程变量。
public class ThreadLocal<T> {
	
	// 获取线程变量
    public T get() {
    	// 1.获取当前线程
        Thread var1 = Thread.currentThread();
        // 2.获取当前线程的 ThreadLocalMap。
        ThreadLocal.ThreadLocalMap var2 = this.getMap(var1);
        // 3.如果 ThreadLocalMap 对象存在,直接获取值;否则初始化 1 个ThreadLocalMap。
        if (var2 != null) {
            ThreadLocal.ThreadLocalMap.Entry var3 = var2.getEntry(this);
            if (var3 != null) {
                Object var4 = var3.value;
                return var4;
            }
        }

        return this.setInitialValue();
    }

	// 初始化 ThreadLocal 值。
    private T setInitialValue() {
        Object var1 = this.initialValue();
        // 1.获取当前线程
        Thread var2 = Thread.currentThread();
        // 2.获取当前线程 ThreadLocalMap对象。
        ThreadLocal.ThreadLocalMap var3 = this.getMap(var2);
        // 3.ThreadLocalMap 已经创建则替换值,否则创建并初始化值
        if (var3 != null) {
            var3.set(this, var1);
        } else {
            this.createMap(var2, var1);
        }

        return var1;
    }

	// 保存线程变量
    public void set(T var1) {
        Thread var2 = Thread.currentThread();
        ThreadLocal.ThreadLocalMap var3 = this.getMap(var2);
        if (var3 != null) {
            var3.set(this, var1);
        } else {
            this.createMap(var2, var1);
        }

    }

    ThreadLocal.ThreadLocalMap getMap(Thread var1) {
        return var1.threadLocals;
    }

    void createMap(Thread var1, T var2) {
        var1.threadLocals = new ThreadLocal.ThreadLocalMap(this, var2);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值