public class ThreadLocalTest {
ThreadLocal<String> tl = new ThreadLocal<String>();
ThreadLocal<String> t2 = new ThreadLocal<String>();
/**
* @author zlz
*
* @time 2013-7-11上午10:14:50
* @param args
*/
public static void main(String[] args) {
ThreadLocalTest tlt = new ThreadLocalTest();
tlt.t2.set("Main Thread 2");
tlt.tl.set("Main Thread");
Thread t = new Thread(new Runnable() {
@Override
public void run() {
ThreadLocalTest tlt = new ThreadLocalTest();
tlt.tl.set("Child Thread Local 1");
tlt.tl.set("Child Thread Local 2");
System.out.println("Child Thread ID:"
+ Thread.currentThread().getId() + "---" + tlt.tl.get());
}
});
t.start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Main Thread ID:" + Thread.currentThread().getId()
+ "---" + tlt.t2.get());
System.out.println("Main Thread ID:" + Thread.currentThread().getId()
+ "---" + tlt.tl.get());
}
}
执行结果:
Child Thread ID:11---Child Thread Local 2
Main Thread ID:1---Main Thread 2
Main Thread ID:1---Main Thread
子线程的值改变后不会影响主线程
单一线程内多次赋值,则最后一次生效
结论:
ThreadLocal 结构如下
Thread类中有对象 ThreadLocal.ThreadLocalMap<ThreadLocal,Object>
ThreadLocal通过 Thread.CurrentThread获取对应的ThreadLocalMap对象
ThreadLocal本身就是一个变量,他只能有一个值。多次赋值则最后一次生效.
JDK源码:
public class ThreadLocal<T> {
...
...
...
/**
* Returns the value in the current thread's copy of this
* thread-local variable. If the variable has no value for the
* current thread, it is first initialized to the value returned
* by an invocation of the {@link #initialValue} method.
*
* @return the current thread's value of this thread-local
*/
public T get() {
Thread t = Thread.currentThread();
//先通过当前线程获取threadLocalMap
ThreadLocalMap map = getMap(t);
if (map != null) {
//再通过当前threadLocal对象this获取值
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
...
}
publicclass Thread implements Runnable
{
ThreadLocal.ThreadLocalMap threadLocals = null;
}
分享到:
相关推荐
通过分析ThreadLocal的源码,我们可以深入理解其内部机制。例如,`initialValue()`方法用于提供默认的初始值,`set()`方法如何将值放入ThreadLocalMap,`get()`方法如何获取值,以及`remove()`方法如何清理线程局部...
以上是对ThreadLocal的简单介绍和源码分析,实际使用中还需要结合具体业务场景进行合理设计和优化。通过深入理解ThreadLocal的工作原理,可以帮助我们更好地利用这一工具,提高代码的并发性能和可维护性。
jdk源码学习 JavaSourceLearn 版本号 版本 corretto-1.8.0_275 方式 逐步阅读源码添加注释、notes文件夹添加笔记 计划学习任务计划 标题为包名,后面序号为优先级1-4,优先级递减 java.lang Object 1 String 1 ...
在JDK 8之前,这个内部Map是`ThreadLocal.ThreadLocalMap`,而从JDK 8开始,改为了`WeakReference<ThreadLocal<?>>`和`Object`的组合,提高了内存管理效率。 **JDK 8之前的ThreadLocalMap** 在JDK 8之前,...
**标题:“JDK的ThreadLocal理解(一)使用和测试”** **正文:** ThreadLocal是Java中的一个非常重要的线程安全工具类,它在多线程编程中扮演着独特的角色。通过创建ThreadLocal实例,我们可以为每个线程提供一个...
4. **ThreadLocal握手机制的改进**:为了解决内存泄漏问题,JDK10对`ThreadLocal`进行了优化,当线程结束时会自动清理相关的存储空间。 接下来,我们转向HotSpot虚拟机,它是Java运行时环境的核心组成部分。HotSpot...
ThreadLocal是Java编程语言中的一个类,用于在多线程环境中提供线程局部变量。它是一种特殊类型的变量,每个线程都有自己的副本,互不影响,从而实现线程间数据隔离。ThreadLocal通常被用来解决线程共享数据时可能...
Java中ThreadLocal工具类(解决多线程程序中并发问题的一种新思路,主要为参数的拷贝问题),感兴趣的话可以查看博文,博文地址:http://blog.csdn.net/otengyue/article/details/38459327
ThreadLocal源码(版本:Android4.3,,含注释)
java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...
首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。
threadlocal源码解析
ThreadLocal 的原理、源码深度分析及使用 ThreadLocal 是 Java 语言中的一种机制,用于实现线程本地存储,能够帮助开发者在多线程环境下解决变量访问安全的问题。下面将对 ThreadLocal 的原理、实现机制、使用方法...
在IT行业中,深入理解JDK源码是提升编程技能的关键步骤。"jdksource:jdk源码阅读"项目正为此目的而设立,它提供了一个平台,让开发者能够详细探索Java开发工具包(Java Development Kit)的内部工作原理。通过阅读...
8. **并发(Concurrency)**:"sun"包中的并发工具类源码展示了Java如何实现线程安全和高性能的并发控制,如Synchronized、Lock、ThreadLocal等。 通过研究这些源码,开发者不仅可以学习到Java语言的细节,还能掌握...
Java并发编程学习之ThreadLocal源码详析 ThreadLocal是Java并发编程中的一种机制,用于解决多线程访问共享变量的问题。它可以使每个线程对共享变量的访问都是线程安全的,使得多线程编程变得更加简单。 ...
ThreadLocal 源码分析和使用 ThreadLocal 是 Java 语言中的一种多线程编程机制,用于解决多线程程序的并发问题。它不是一个 Thread,而是一个 Thread 的局部变量。ThreadLocal 的出现是为了解决多线程程序中的共享...
ThreadLocal源码以及应用
jdk8源码的阅读理解 导入idea步骤: 阅读顺序: 大致思路 基本类型的包装类(Character放在最后) String、StringBuffer、StringBuilder、StringJoiner、StringTokenizer(补充正则表达式的知识) CharacterIterator、...
**线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...