打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
threadlocal

大纲:

  1. 用法

  2. 源码

一、用法

ThreadLocal是一个容器,顾名思义就是把一个变量存到线程本地。

class Test {public static void main(String[] args)  {new Thread(new TestLocal()).start();new Thread(new TestLocal()).start();new Thread(new TestLocal()).start();    }}class TestLocal implements Runnable {    ThreadLocal<String> localName = new ThreadLocal<>();    @Overridepublic void run() {        localName.set(Thread.currentThread().getName());        System.out.println(localName.get());    }}/**结果: * Thread-0 * Thread-1 * Thread-2 */

二、源码

ThreadLocal是线程本地变量,因此每个Thread对象内部必然存储ThreadLocal,ThreadLocal作为key,存储在ThreadLocalMap中。

class Thread {    ThreadLocal.ThreadLocalMap threadLocals = null; //每个线程对象内部维护了一个ThreadLocal.ThreadLocalMap。...}

ThreadLocal主要方法就是set,get

  • set:

public class ThreadLocal<T> {static class ThreadLocalMap {...} //ThreadLocalMap是ThreadLocal的静态内部类...public void set(T value) {        Thread t = Thread.currentThread(); //拿到当前线程ThreadLocalMap map = getMap(t); //取出线程维护的ThreadLocalMapif (map != null)            map.set(this, value); //ThreadLocalMap的key为当前ThreadLocal对象,value就是我们需要存储的变量elsecreateMap(t, value); //该线程第一次使用ThreadLocal.set时创建ThreadLocalMap对象,并赋值。}void createMap(Thread t, T firstValue) {        t.threadLocals = new ThreadLocalMap(this, firstValue);    }    ThreadLocalMap getMap(Thread t) {return t.threadLocals;    }

  ...}
  • get:

public class ThreadLocal<T> {public T get() {        Thread t = Thread.currentThread();        ThreadLocalMap map = getMap(t); //从当前线程取出ThreadLocalMapif (map != null) {            ThreadLocalMap.Entry e = map.getEntry(this); //以当前ThreadLocal对象为key取出ThreadLocalMap.Entryif (e != null) {                T result = (T)e.value;return result;            }        }return setInitialValue(); //如果这个ThreadLocal对象没有赋值直接get,会给它赋值为null并返回。}private T setInitialValue() {        T value = initialValue();        Thread t = Thread.currentThread();        ThreadLocalMap map = getMap(t);if (map != null)            map.set(this, value);elsecreateMap(t, value);return value;    }protected T initialValue() {return null;    }

  ...}

ThreadLocal get、set思想小结:

  1. 拿到当前线程对象。

  2. 拿到线程对象内部维护的ThreadLocalMap对象。

  3. 一个线程对象中只有一个ThreadLocalMap对象,所有ThreadLocal对象及这个ThreadLocal对象存储的值都以key-value的形式存在ThreadLocalMap中。(ThreadLocalMap的key是ThreadLocal对象,value是需要存储的变量。)

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
深入JDK源码之ThreadLocal类
ThreadLocal快速了解一下
彻底理解ThreadLocal
一文搞懂 ThreadLocal 原理
ThreadLocal原理及使用示例
Java中ThreadLocal无锁化线程封闭实现原理 – 码农网
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服