4

8.ThreadLocal的应用及源码

 4 years ago
source link: http://sunliangliang.com/?p=46
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

相信不少小伙伴都知道ThreadLocal这个知识点,或者在面试中被问道过,

  • ThreadLocal是什么?
  • ThreadLocal的用法以及应用场景
  • ThreadLocal源码角度分析
  • ThreadLocal存在的问题以及解决方案
  • ThreadLocal线程局部变量,又有人称线程本地副本,在多线程环境下,如果是共享的数据,我们可以使用volatile,synchronized, lock等方式处理。
  • 如果是线程自己的变量副本,每个线程直接操作自己的本地副本即可。此时就可以使用ThreadLocal

2.ThreadLocal的用法以及应用场景

public class ThreadLocalDemo {
  public static void main(String[] args) {
    Task task = new Task();
    Thread t1 = new Thread(task);
    Thread t2 = new Thread(task);
    t1.start();
    t2.start();
  }
  static class Task implements Runnable{
    ThreadLocal<Integer> txId = new ThreadLocal<>();
    @Override
    public void run() {
      txId.set((int)(Math.random()*10));
      try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      System.out.println(txId.get());
    }
  }
}

  • 每个线程使用ThreadLocal中自己的数据,

3.ThreadLocal源码解析

3.1.set方法

public void set(T value) {
    Thread t = Thread.currentThread();
    //获取到ThreadLocalMap
    ThreadLocalMap map = getMap(t);
    if (map != null)
        map.set(this, value);
    else
        createMap(t, value);
}
//这里获取的线程`Thread`属性`threadLocals`
ThreadLocalMap getMap(Thread t) {
    return t.threadLocals;
}

我们从线程Thread类中找到了如下代码

/* ThreadLocal values pertaining to this thread. This map is maintained
    * by the ThreadLocal class. */
ThreadLocal.ThreadLocalMap threadLocals = null;

/*
    * InheritableThreadLocal values pertaining to this thread. This map is
    * maintained by the InheritableThreadLocal class.
    */
ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
  • 也就是说线程Thread类有一个ThreadLocalMap的熟悉来维护ThreadLocal,也就是说我们通过线程类的一个map来维护这个副本变量的。

3.2.get方法

public T get() {
    Thread t = Thread.currentThread();
    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();
}

Recommend

  • 116
    • liuzhengyang.github.io 7 years ago
    • Cache

    ThreadLocal使用和源码分析 | 刘正阳

    ThreadLocal介绍java.lang.ThreadLocal&lt;T&gt; 类是Java提供的用来保存线程本地变量的机制。说道线程本地变量很容易和和线程栈帧里的本地变量表联系起来。不过ThreadLocal的最普遍的用途是避免线程安全问题和框架代码实现模板模式。说道线程安全又要温习...

  • 54
    • 微信 mp.weixin.qq.com 7 years ago
    • Cache

    线程封闭之ThreadLocal源码详解

  • 52
    • 微信 mp.weixin.qq.com 7 years ago
    • Cache

    线程封闭之 ThreadLocal 源码详解

    线程封闭之 ThreadLocal 源码详解

  • 67
    • xiaozhuanlan.com 6 years ago
    • Cache

    带你了解源码中的 ThreadLocal

    这次想来讲讲 ThreadLocal 这个很神奇的东西,最开始接触到这个是看了主席的《开发艺术探索》,后来是在研究 ViewRootImpl 中又碰到一次,而且还发现 Android 中一个小彩蛋,就越发觉得这个东西很有趣,那么便借助主席...

  • 30
    • www.cnblogs.com 4 years ago
    • Cache

    ThreadLocal源码解析-Java8

    目录 2.1ThreadLocal的类层级关系 2.2ThreadLocal的属性字段 2.6ThreadLocal-remove操作 3.0线性探测算法解决hash冲突 3.2ThreadLocalMap的常量介绍 3.4ThreadLocalM...

  • 23
    • www.cnblogs.com 4 years ago
    • Cache

    Thread、ThreadLocal源码解析

    今天来看一下Thread和ThreadLocal类的源码。 一、Thread (1)首先看一下线程的构造方法,之后会说每种参数的用法,而所有的构造函数都会指向init方法 //空构造创建一个线程 Thread() //传入Runnable对象创...

  • 10
    • segmentfault.com 3 years ago
    • Cache

    简单扣一下ThreadLocal源码

    简单扣一下ThreadLocal源码发布于 4 分钟前ThreadLocal内部定义了一个静态内部类ThreadLocalMap,这个Map的key就是当前的ThreadLo...

  • 7
    • www.cnblogs.com 2 years ago
    • Cache

    ThreadLocal源码学习笔记 - Cuzzz

    系列文章目录和关于我 一丶ThreadLocal结构

  • 4
    • blog.51cto.com 2 years ago
    • Cache

    ThreadLocal源码解析及实战应用

    ThreadLocal源码解析及实战应用 精选 原创 作者:京东物流 闫鹏勃1 什么是ThreadLocal...

  • 8

    ThreadLocal底层源码解析 ThreadLocal:顾名思义的意思是本地线程或者局部线程的意思,其真正含义是希望多个线程之间拥有自己的局部变量,多个线程间拥有自己的私人变量,在多线程间不被共享,被线程单独享用,这就是T...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK