ThreadLocal类提供线程局部变量。这些变量和其他普通的变量的区别在于,每个线程获取的线程局部变量都拥有自己相对独立的初始化过的副本。ThreadLocal的实例通常被声明为private static 来希望达到关联线程的状态的目的(例如:userId,transaction id)。
按我本人的理解有两点注意:
第一:ThreadLocal提供的线程局部变量通常都是新new的。这个他们都是初始一样的,最后和线程关联的,相对独立的。
第二:ThreadLocal是为了解决线程内部数据共享,而不是为了解决线程间数据共享(synchronized).将同一个引用分别放到不同线程的threadLoca变量中,一个改变,都改变。
看一下ThreadLocal的成员变量
private final int threadLocalHashCode = nextHashCode(); private static AtomicInteger nextHashCode = new AtomicInteger(); private static final int HASH_INCREMENT = 0x61c88647; private static int nextHashCode() { return nextHashCode.getAndAdd(HASH_INCREMENT); }
每个threadLocal有一个threadLocalHashCode变量,每个ThreadLocal实例的threadLocalHashCode值都是不一样的,每次都是在上次的基础上增加HASH_INCREMENT。至于为什么是这个数,主要是为了解决
冲突问题,这个特殊的hash值是定制化的。
ThreadLocal对象的重要方法解析
先看set方法及其相关方法:
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); } ThreadLocalMap getMap(Thread t) { return t.threadLocals; } void createMap(Thread t, T firstValue) { t.threadLocals = new ThreadLocalMap(this, firstValue); }
ThreadLocal调用set的过程就是:获取当前线程对象的ThreadLocalMap变量,如果存在就以ThreadLocal实例为key,传入的值为value存入ThreadLocalMap变量。如果不存在就new一个ThreadLocalMap对象,并且赋给当前线程对象。
再看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(); } private T setInitialValue() { T value = initialValue(); Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); return value; }
get的过程是:获取当前线程实例的ThreadLocalMap变量,它是一个map,之前存的时候是以threadlocal对象作为key的,现在先试图通过这个key(也就是this),获取ThreadLocalMap.Entry类型的值。如果获取不为空,返回value,如果为空,说明之前没有存,这个时候调用setInitialValue()。这个方法调用initialValue()方法,初始化value,以ThreadLocal对象为key(也就是this), value为值,初始化ThreadLocalMap,并返回value.
再看一下ThreadLocal对象的remove方法
public void remove() { ThreadLocalMap m = getMap(Thread.currentThread()); if (m != null) m.remove(this); }
remove的过程就是调用ThreadLocalMap的remove方法,移除以threadlocal为key的值。
至此,我们发现,调用ThreadLocal的方法,其实内部是调用本线程实例对象(Thread)的ThreadLocalMap成员变量的想关方法实现的.因此,ThreadLocalMap才是理解线程局部变量的关键。
相关推荐
ThreadLocal是Java中的一个线程局部变量类,它为每个线程创建了一个独立的变量副本。这意味着每个线程都有自己的ThreadLocal变量,互不干扰,提供了线程安全的数据存储方式。ThreadLocal通常用于在多线程环境下为每...
首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。
ThreadLocal 源码分析和使用 ThreadLocal 是 Java 语言中的一种多线程编程机制,用于解决多线程程序的并发问题。它不是一个 Thread,而是一个 Thread 的局部变量。ThreadLocal 的出现是为了解决多线程程序中的共享...
通过分析ThreadLocal的源码,我们可以深入理解其内部机制。例如,`initialValue()`方法用于提供默认的初始值,`set()`方法如何将值放入ThreadLocalMap,`get()`方法如何获取值,以及`remove()`方法如何清理线程局部...
Java并发编程学习之ThreadLocal源码详析 ThreadLocal是Java并发编程中的一种机制,用于解决多线程访问共享变量的问题。它可以使每个线程对共享变量的访问都是线程安全的,使得多线程编程变得更加简单。 ...
Java并发编程中,ThreadLocal是一个非常重要的类,它是解决线程安全问题的一个工具。ThreadLocal提供了一种在多线程环境下使用“共享变量”的方式,但是它实际上是为每个线程提供一个变量的副本,这样每个线程都可以...
以上是对ThreadLocal的简单介绍和源码分析,实际使用中还需要结合具体业务场景进行合理设计和优化。通过深入理解ThreadLocal的工作原理,可以帮助我们更好地利用这一工具,提高代码的并发性能和可维护性。
ThreadLocal是Java中的一个非常重要的线程安全工具类,它在多线程编程中扮演着独特的角色。通过创建ThreadLocal实例,我们可以为每个线程提供一个独立的变量副本,这些副本在各个线程之间互不影响,从而实现线程局部...
ThreadLocal 的原理、源码深度分析及使用 ThreadLocal 是 Java 语言中的一种机制,用于实现线程本地存储,能够帮助开发者在多线程环境下解决变量访问安全的问题。下面将对 ThreadLocal 的原理、实现机制、使用方法...
ThreadLocal的源码分析: 首先是类的介绍。ThreadLocal类提供了线程本地变量。这些变量使每个线程都有自己的一份拷贝。ThreadLocal期望能够管理一个线程的状态,例如用户id或事务id。 ThreadLocal的使用有很多...
在分析ThreadLocal源码时,可以了解到它如何在内部实现线程隔离,以及ThreadLocalMap的结构和工作方式。理解这些细节有助于我们更好地利用ThreadLocal,同时避免可能出现的问题。通过阅读源码,我们可以发现...
此外,分析ThreadLocal内存泄露可以借助一些工具,例如JProfiler、VisualVM或Java自带的JConsole等,它们可以帮助我们观察和定位内存中的异常情况。 了解ThreadLocal的内存泄露机制以及如何避免它,对于编写高效、...
源码分析: 在Java的`ThreadLocal`实现中,每个线程都有一个`ThreadLocalMap`,它是`ThreadLocal`的一个内部类,用于存储线程局部变量。`ThreadLocalMap`使用弱引用作为键,目的是在线程不再引用ThreadLocal对象时,...
6. **源码分析**: ThreadLocal类的核心在于`initialValue()`方法和`get()`方法。`initialValue()`是线程首次访问ThreadLocal变量时调用的,返回的是默认值。`get()`方法则会查找当前线程的ThreadLocalMap,如果...
5. **源码分析**: - `ThreadLocal`类在`java.lang`包下,它的实现主要依赖于`Thread`类的成员变量`threadLocals`,这是一个`ThreadLocalMap`实例,`ThreadLocalMap`是`WeakReference<ThreadLocal<?>>`和`Object`...
标题所指的知识点为“Druid 源码分析 逐层详解”,意味着我们需要深入分析Druid这一开源数据处理工具的源码,并从不同的层面揭示其内部实现机制。 首先,我们来看Druid的构架设计。Druid采用了分层的架构,每个层次...
标题:hibernate源码分析一[启动过程] 在深入探讨Hibernate框架的启动过程之前,我们首先需要了解几个核心的概念和类,它们是Hibernate启动流程的基石。 ### 1. 关键类与接口 #### Environment类 `Environment`类...
10. **源码分析**:通过对JUC库中部分关键类的源码分析,帮助学员深入理解并发工具的内部实现,提升问题排查和优化能力。 通过这门课程的学习,你将具备扎实的Java并发编程能力,能够设计出高效、稳定的并发程序,...
一、简介 ThreadLocal是JDK包提供的,它提供了线程本地变量,也就是如果你创建了一个ThreadLocal变量,那么访问这个变量的每一个线程都会有这个变量的一个本地副本。...根据源码,画出ThreadLocal原理图 原创文章
在Java编程中,ThreadLocal是线程局部变量的类,它为每个线程提供了一个独立的变量副本,各个线程可以独立地改变自己的副本,而不会影响其他线程的副本。ThreadLocal通常用于解决多线程环境中的数据隔离问题,避免了...