ThreadLocal

概述

ThreadLocal实例仅作为线程局部变量的操作类,以及线程存储局部变量时的Key。真正的线程局部变量是存储在各自线程的本地,通过Thread类中的ThreadLocal.ThreadLocalMap threadLocals进行存储。

若希望在线程本地存储多个局部变量需要使用多个ThreadLocal实例进行操作。

ThreadLocal源码示例

  • set(T v)方法

    通过Thread.currentThread()获取当前的线程实例,然后获取当前线程实例里的ThreadLocal.ThreadLocalMap threadLocals,若不存在该集合对象则创建。最后,将当前ThreadLocal实例作为Key,将参数值v存储当前线程的threadLocals集合中。即var3.set(this, var1);

  • get()方法

    通过Thread.currentThread()获取当前的线程实例,然后获取当前线程实例里的ThreadLocal.ThreadLocalMap threadLocals,若该集合对象不为空,则用当前ThreadLocal实例作为Key,从集合对象中获取之前存储的值。即var3 = var2.getEntry(this);

  1. public T get() {
  2. Thread var1 = Thread.currentThread();
  3. ThreadLocal.ThreadLocalMap var2 = this.getMap(var1);
  4. if (var2 != null) {
  5. ThreadLocal.ThreadLocalMap.Entry var3 = var2.getEntry(this);
  6. if (var3 != null) {
  7. Object var4 = var3.value;
  8. return var4;
  9. }
  10. }
  11. return this.setInitialValue();
  12. }
  13. private T setInitialValue() {
  14. Object var1 = this.initialValue();
  15. Thread var2 = Thread.currentThread();
  16. ThreadLocal.ThreadLocalMap var3 = this.getMap(var2);
  17. if (var3 != null) {
  18. var3.set(this, var1);
  19. } else {
  20. this.createMap(var2, var1);
  21. }
  22. return var1;
  23. }
  24. public void set(T var1) {
  25. Thread var2 = Thread.currentThread();
  26. ThreadLocal.ThreadLocalMap var3 = this.getMap(var2);
  27. if (var3 != null) {
  28. var3.set(this, var1);
  29. } else {
  30. this.createMap(var2, var1);
  31. }
  32. }
  33. public void remove() {
  34. ThreadLocal.ThreadLocalMap var1 = this.getMap(Thread.currentThread());
  35. if (var1 != null) {
  36. var1.remove(this);
  37. }
  38. }
  39. ThreadLocal.ThreadLocalMap getMap(Thread var1) {
  40. return var1.threadLocals;
  41. }
  42. void createMap(Thread var1, T var2) {
  43. var1.threadLocals = new ThreadLocal.ThreadLocalMap(this, var2);
  44. }

Thread源码示例

Thread类使用ThreadLocal.ThreadLocalMap threadLocals集合对象盛装线程局部变量。

  1. public class Thread implements Runnable {
  2. /* Make sure registerNatives is the first thing <clinit> does. */
  3. private static native void registerNatives();
  4. static {
  5. registerNatives();
  6. }
  7. private volatile String name;
  8. private int priority;
  9. private Thread threadQ;
  10. private long eetop;
  11. /* Whether or not to single_step this thread. */
  12. private boolean single_step;
  13. /* Whether or not the thread is a daemon thread. */
  14. private boolean daemon = false;
  15. /* JVM state */
  16. private boolean stillborn = false;
  17. /* What will be run. */
  18. private Runnable target;
  19. /* The group of this thread */
  20. private ThreadGroup group;
  21. /* The context ClassLoader for this thread */
  22. private ClassLoader contextClassLoader;
  23. /* The inherited AccessControlContext of this thread */
  24. private AccessControlContext inheritedAccessControlContext;
  25. /* For autonumbering anonymous threads. */
  26. private static int threadInitNumber;
  27. private static synchronized int nextThreadNum() {
  28. return threadInitNumber++;
  29. }
  30. /* ThreadLocal values pertaining to this thread. This map is maintained
  31. * by the ThreadLocal class. */
  32. ThreadLocal.ThreadLocalMap threadLocals = null;

ThreadLocal理解的更多相关文章

  1. Android线程管理之ThreadLocal理解及应用场景

    前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...

  2. 谈话Java在ThreadLocal理解类

    我们必须先了解:ThreadLocal不超过一个线程类,或者它应该被称为线程局部变量.这从ThreadLocal的JDK我们可以看到的定义 public class ThreadLocal<T& ...

  3. java ThreadLocal理解和使用

    一.ThreadLoal的理解 ThreadLoal 变量,它的基本原理是,同一个 ThreadLocal 所包含的对象(对ThreadLocal< String >而言即为 String ...

  4. Java ThreadLocal 理解

    ThreadLocal 概念: ThreadLocal不是用来解决对象共享访问的问题,而主要是提供了保存对象的方法和避免参数传递的方便的对象访问方式. ThreadLocal并不是一个Thread,而 ...

  5. ThreadLocal 理解

    主要方法 public void set(T value); public T get(); private T setInitialValue(); public void set(T value) ...

  6. 我是如何理解ThreadLocal

    ThreadLocal的概念 ThreadLocal从英文的角度看,可以看成thread和local的组合,就是线程本地的意思,我们都知道,看过jvm内存分配的人都知道在jvm虚拟机中对每一个线程都分 ...

  7. ThreadLocal的理解与应用场景分析

    对于Java ThreadLocal的理解与应用场景分析 一.对ThreadLocal理解 ThreadLocal提供一个方便的方式,可以根据不同的线程存放一些不同的特征属性,可以方便的在线程中进行存 ...

  8. 深入理解线程本地变量ThreadLocal

    ThreadLocal理解: 假设在多线程并发环境中.一个可变对象涉及到共享与竞争,那么该可变对象就一定会涉及到线程间同步操作,这是多线程并发问题. 否则该可变对象将作为线程私有对象,可通过Threa ...

  9. JavaSe:ThreadLocal

    JDK中有一个ThreadLocal类,使用很方便,但是却很容易出现问题.究其原因, 就是对ThreadLocal理解不到位.最近项目中,出现了内存泄漏的问题.其中就有同事在使用ThreadLocal ...

随机推荐

  1. 132.1.001 Union-Find | 并查集

    @(132 - ACM | 算法) Algorithm | Coursera - by Robert Sedgewick > Tip: Focus on WHAT is really impor ...

  2. zookeeper应用 - leader选举 锁

    模拟leader选举: 1.zookeeper服务器上有一个/leader节点 2.在/leader节点下创建短暂顺序节点/leader/lock-xxxxxxx 3.获取/leader的所有子节点并 ...

  3. VisualSVN server搭建装配和指定IP或域名

    在主机商边绑定A记录即可

  4. 10 tensorflow在循环体中用tf.print输出节点内容

    代码 i=tf.constant(0,dtype=tf.int32) batch_len=tf.constant(10,dtype=tf.int32) loop_cond = lambda a,b: ...

  5. Ubuntu-18.04 下修改root用户密码,安装SSH服务,允许root用户远程登录,安装vsftp服务器

    修改root用户密码 打开终端,输入 sudo passwd root 指令: 安装SSH服务 ssh默认端口号是22,可以在/etc/ssh/sshd_config文件中修改 查看服务器否开启:ne ...

  6. 使用AHKActionSheet

    使用AHKActionSheet https://github.com/fastred/AHKActionSheet 基本配置代码: AHKActionSheet *actionSheet = [[A ...

  7. mysql内存评估计算

    这是一个可以评估mysql内存使用大小的网站,根据一些基本的参数,来确定的. 网站:http://www.mysqlcalculator.com/

  8. Python学习---装饰器/迭代器/生成器的学习【all】

    Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210

  9. 审计系统---paramiko模块学习

    paramiko模块学习 [更多参考]http://www.cnblogs.com/wupeiqi/articles/4963027.html [paramiko的Demo实例]https://git ...

  10. 【matlab】 拉格朗日插值

    第一个函数  "lagrange1.m" 输入:X Y 与点x0 输出:插值函数对应函数值 y0 function y = lagrange1(X,Y,x0) n = length ...