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);

    public T get() {
Thread var1 = Thread.currentThread();
ThreadLocal.ThreadLocalMap var2 = this.getMap(var1);
if (var2 != null) {
ThreadLocal.ThreadLocalMap.Entry var3 = var2.getEntry(this);
if (var3 != null) {
Object var4 = var3.value;
return var4;
}
} return this.setInitialValue();
} private T setInitialValue() {
Object var1 = this.initialValue();
Thread var2 = Thread.currentThread();
ThreadLocal.ThreadLocalMap var3 = this.getMap(var2);
if (var3 != null) {
var3.set(this, var1);
} else {
this.createMap(var2, var1);
} return var1;
} public void set(T var1) {
Thread var2 = Thread.currentThread();
ThreadLocal.ThreadLocalMap var3 = this.getMap(var2);
if (var3 != null) {
var3.set(this, var1);
} else {
this.createMap(var2, var1);
} } public void remove() {
ThreadLocal.ThreadLocalMap var1 = this.getMap(Thread.currentThread());
if (var1 != null) {
var1.remove(this);
} } ThreadLocal.ThreadLocalMap getMap(Thread var1) {
return var1.threadLocals;
} void createMap(Thread var1, T var2) {
var1.threadLocals = new ThreadLocal.ThreadLocalMap(this, var2);
}

Thread源码示例

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

    public class Thread implements Runnable {
/* Make sure registerNatives is the first thing <clinit> does. */
private static native void registerNatives();
static {
registerNatives();
}
private volatile String name;
private int priority;
private Thread threadQ;
private long eetop;
/* Whether or not to single_step this thread. */
private boolean single_step;
/* Whether or not the thread is a daemon thread. */
private boolean daemon = false;
/* JVM state */
private boolean stillborn = false;
/* What will be run. */
private Runnable target;
/* The group of this thread */
private ThreadGroup group;
/* The context ClassLoader for this thread */
private ClassLoader contextClassLoader;
/* The inherited AccessControlContext of this thread */
private AccessControlContext inheritedAccessControlContext;
/* For autonumbering anonymous threads. */
private static int threadInitNumber;
private static synchronized int nextThreadNum() {
return threadInitNumber++;
}
/* ThreadLocal values pertaining to this thread. This map is maintained
* by the ThreadLocal class. */
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. OpenGL学习--01--打开一个窗口

    // Include standard headers #include <stdio.h> #include <stdlib.h> // Include GLEW #incl ...

  2. 跳过ssh在首次连接出现检查keys 的提示

    1.将需要登陆主机得公钥添加到known_hosts ssh-keyscan 192.168.77.129 192.168.77.130 >> /root/.ssh/known_hosts ...

  3. 如何计算tomcat线程池大小?

    背景 在我们的日常开发中都涉及到使用tomcat做为服务器,但是我们该设置多大的线程池呢?以及根据什么原则来设计这个线程池呢? 接下来,我将介绍本人是怎么设计以及计算的. 目标 确定tomcat服务器 ...

  4. 从零开始——MySql01

    注:如有侵权,请速联系,会速度删除!(都是同学分享的内容) 安装详解: 链接:http://pan.baidu.com/s/1skMQVgx 密码:z0xh Navicat安装包: 链接:http:/ ...

  5. ubuntu 下mysql导入出.sql文件

    1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql 2.导 ...

  6. mysql优化——explain详解

    MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...

  7. 如何生成.p12文件

    如何生成.p12文件 1. 打开钥匙串 2. 钥匙串选登录,种类选证书 3. 选择开发者,然后导出证书 4. 存储证书 5. 选择存储的时候会提示输入证书的密码,当然,也可以不用输入密码 6. 点击上 ...

  8. Codewars, Leetcode, Hackerrank. Online Judges Reviews

    http://jasonjl.me/blog/2015/03/30/practical-programming-practice-services/ Codewars, Leetcode, Hacke ...

  9. Python学习---Form拾遗180322

    Form操作之错误信息操作 1. 用户发送请求过来 2. for 循环对字段进行正则表达式的验证  fields.clean(value) 3. 自定义clean_字段() 进行名字段值正确性的校验 ...

  10. 【Pygame】 简易五子棋

    import pygame import sys import time import random pygame.init() screen_size = (800,560) WIDTH = 720 ...