• 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

  • 相关阅读:
    爱情戒指
    李小龙
    20分钟
    大话JAVA(二)
    编程高手
    Free Computer Books, Free eBooks and Read Free Books Online
    (06) [修正版] 判断整数序列是不是二元查找树的后序遍历结果
    [原创]DateTime在使用 format Custom Date and Time Format Strings时遇到的问题和解决方法
    [原创]00:矩形算法题二分法的扩展(2分法 * 2分法)
    用堆栈和用递归分别实现倒序打印
  • 原文地址:https://www.cnblogs.com/xiaoxiao1120/p/13384311.html
Copyright © 2020-2023  润新知