java多线程之ThreadLocal

ThreadLocal类可以为每个线程内部分配变量。保证各个线程之间的变量相互独立。

基本用法:

public class TestThreadLocal {
    static class MyThread implements Runnable{

        private ThreadLocal<Integer> threadLocal = new ThreadLocal<>();

        @Override
        public void run() {
            for(int i=0;i<10;i++){
                threadLocal.set(i);
                System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
            }
        }
    }

    public static void main(String[] args) {
        Thread thread1 = new Thread(new MyThread(),"线程A");
        Thread thread2 = new Thread(new MyThread(),"线程B");

        thread1.start();
        thread2.start();
    }
}

方法:

  • T get() 获取当前线程的ThreadLocal值
  • void set(T value) 设置当前线程的ThreadLocal值
  • T initialValue() 设置当前线程ThreadLocal的初始值
  • void remove() 删除与当前线程关联的ThreadLocal值

源码解析:

//get()方法
public T get() {
        Thread t = Thread.currentThread();
//获取当前线程的 ThreadLocalMap对象
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }

ThreadLocalMap类有一个静态内部类Entry

static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }

ThreadLocalMap类有一个Entry[] table属性,用来存放<ThreadLocal k,Object v>类型的Entry。
Entry的k对应每个线程中的ThreadLocal,value对应ThreadLocal中set()方法设置的值。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。