Java:ThreadLocal

文章目录

            • 1.定义
            • 2.作用
            • 3.具体使用
            • 4.源码解析

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

    public static void main(String[] args) {
    
        ThreadLocal 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 {
	
	// 获取线程变量
    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);
    }

}

你可能感兴趣的:(Java,Android,多线程,Java,ThreadLocal,多线程)