Java中的ThreadLocal

Posted lidongsheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的ThreadLocal相关的知识,希望对你有一定的参考价值。

ThreadLocal:一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据;

ThreadLocal提供了线程内存储变量的能力,这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过get和set方法就可以得到当前线程对应的值;

使用方法:

static final ThreadLocal<T> sThreadLocal = new ThreadLocal<T>();
sThreadLocal.set()
sThreadLocal.get()

get、set方法:

//set 方法
public void set(T value) {
      //获取当前线程
      Thread t = Thread.currentThread();
      //实际存储的数据结构类型
      ThreadLocalMap map = getMap(t);
      //如果存在map就直接set,没有则创建map并set
      if (map != null)
          map.set(this, value);
      else
          createMap(t, value);
  }
  
//getMap方法
ThreadLocalMap getMap(Thread t) {
      //thred中维护了一个ThreadLocalMap
      return t.threadLocals;
 }
 
//createMap
void createMap(Thread t, T firstValue) {
      //实例化一个新的ThreadLocalMap,并赋值给线程的成员变量threadLocals
      t.threadLocals = new ThreadLocalMap(this, firstValue);
}

每个线程持有一个ThreadLocalMap对象;

为了解决多线程中相同变量的访问冲突问题;

示例:

public class ThreadLocalTest {

    static ThreadLocal<String> threadLocal = new ThreadLocal<>();

    public static void main(String[] args) {
        //在main线程中添加main线程的本地变量
        threadLocal.set("mainVal");
        //新创建一个子线程
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("子线程中的本地变量值:"+threadLocal.get());
            }
        });
        thread.start();
        //输出main线程中的本地变量值
        System.out.println("mainx线程中的本地变量值:"+threadLocal.get());
    }
}

输出:

mainx线程中的本地变量值:mainVal
子线程中的本地变量值:null

以上是关于Java中的ThreadLocal的主要内容,如果未能解决你的问题,请参考以下文章

14Java并发性和多线程-Java ThreadLocal

ThreadLocal

[Java并发包学习七]解密ThreadLocal

谈谈Java引用和Threadlocal的那些事

java 中的 ThreadLocal

java中的引用与ThreadLocal