`
yaerfeng1989
  • 浏览: 234040 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java多线程模式ThreadLocal原理简述及其使用详解

阅读更多

原创整理不易,转载请注明出处:java多线程模式ThreadLocal原理简述及其使用详解

代码下载地址:http://www.zuidaima.com/share/1781557457128448.htm

ThreadLocal是为了使每个线程保存一份属于自己的数据。
先看一个使用ThreadLocal的实例。

 package com.zuidaima.aop.framework;

 import com.zuidaima.core.NamedThreadLocal;

 public abstract class AopContext {

 private static final ThreadLocal <Object> currentProxy= new NamedThreadLocal <Object> ( " Current AOP proxy " );

 public static Object currentProxy() throws IllegalStateException {
 Object proxy= currentProxy.get();
 if (proxy== null ) {
 throw new IllegalStateException(
 " Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available. " );
 }
 return proxy;
 }

 static Object setCurrentProxy(Object proxy) {
 Object old= currentProxy.get();
 if (proxy != null ) {
 currentProxy.set(proxy);
 }
 else {
 currentProxy.remove();
 }
 return old;
 }

}


上例展示的是spring框架中获取当前线程的代理对象的方法,AopContext.currentProxy(),在本线程的程序调用栈中只要调用AopContext的静态方法就可以获取本线程相关的代理对象。如果不用ThreadLocal,那么这个代理对象在创建后,就要一层层传递下去,才能在后面获取到并使用。
通过这个例子,我们可以知道[b]ThreadLocal主要是提供了一种保持对象的方法以及避免了对象在程序调用中传递的简便访问方法。ThreadLocal与共享数据和同步没有明显关系。[/b]

下面看看相关的源码以了解具体的结构。

public class Thread implements Runnable {
 // ThreadLocalMap是一个以ThreadLocal为key,Object为值的map,由ThreadLocal维护 
 ThreadLocal.ThreadLocalMap threadLocals= null ;
}


从Thread的源码中可以得知,是每一个Thread持有一个自己的map,并不是一个ThreadLocal持有一个map。

 public class ThreadLocal <T> {

 public T get() {
 // 获取当前线程 
 Thread t= Thread.currentThread();
 // 获取当前线程的threadLocals变量 
 ThreadLocalMap map= getMap(t);
 // 从当前线程的threadLocals变量中取得本threadLocal为key的值 
 if (map != null ) {
 ThreadLocalMap.Entry e= map.getEntry( this );
 if (e != null )
 return (T)e.value;
 }
 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;
 }
 
 
 public void set(T value) {
 // 获取当前线程 
 Thread t= Thread.currentThread();
 // 获取当前线程的threadLocals变量 
 ThreadLocalMap map= getMap(t);
 // 以本threadLocal为key的保存值到当前线程的threadLocals变量中去 
 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过程: 对于每一个需要线程保存自身实例的变量,需要定义一个静态的ThreadLocal实例。然后将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象。
此外,每个线程保存的自身数据并不是通过备份或复制的,而是new创建出来的。

通过ThreadLocal各个线程只能获取自身对应的数据,不能访问其他线程的数据,但是如果两个线程在set时引用了同一个数据,仍然存在同步问题。

2
0
分享到:
评论
1 楼 xiaohuafyle 2014-05-19  
不排版的啊,看着累死了

相关推荐

    java ThreadLocal多线程专属的变量源码

    java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...

    java多线程设计模式详解

    Java多线程设计模式是Java编程中不可或缺的一部分,它涉及到如何在并发环境下高效、安全地组织代码...阅读提供的"java多线程设计模式详解.pdf"和"Java多线程设计模式源码"文件,将能更深入地理解这些模式的实际运用。

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    java多线程设计模式详解(PDF及源码)

    本资源“java多线程设计模式详解”涵盖了这一主题的深入探讨,包括PDF文档和源码示例。 多线程设计模式是程序员在开发高效、稳定且可维护的多线程应用程序时遵循的一系列最佳实践。以下是一些常见的Java多线程设计...

    java中ThreadLocal详解

    ### Java中ThreadLocal详解 #### 一、ThreadLocal概述 在Java多线程编程中,`ThreadLocal`是一个非常重要的工具类,它提供了一种在每个线程内部存储线程私有实例的方法。通常情况下,当多个线程共享某个变量时,...

    JAVA多线程设计模式详解

    本书“JAVA多线程设计模式详解”深入探讨了这一主题,旨在帮助开发者理解和掌握如何在Java环境中高效地使用多线程。 首先,基础内容介绍涵盖了线程的基本概念,包括进程与线程的区别,线程的创建方式,如通过实现...

    java多线程的讲解和实战

    本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者以及希望深入理解多线程的开发者。 1. **线程的基本概念**:线程是程序执行的最小单位,一个进程中可以有多个线程同时运行。Java...

    Java多线程 之 临界区、ThreadLocal.docx

    Java多线程编程中,临界区和ThreadLocal是两种重要的并发控制机制,它们用于解决多线程环境下的数据安全问题。 1. **临界区(Critical Section)** 临界区是指一段代码,它在同一时刻只允许一个线程进行访问。在...

    简单分析Java线程编程中ThreadLocal类的使用共

    Java线程编程中的ThreadLocal类是一个非常重要的工具,它在多线程环境下提供了一种线程局部变量的机制。ThreadLocal并非是简单的变量,而是一种能够确保每个线程都拥有独立副本的变量容器。理解ThreadLocal的工作...

    Java中ThreadLocal的设计与使用

    Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,...总之,ThreadLocal是Java多线程编程中的一个强大工具,但使用时需谨慎,理解其工作原理和潜在风险,才能更好地利用它来解决实际问题。

    Java ThreadLocal详解_动力节点Java学院整理

    Java ThreadLocal详解 ThreadLocal是Java中的一种机制,可以将变量与线程关联起来,使得每个线程都可以拥有自己的变量副本。 ThreadLocal的出现是为了解决多线程编程中的线程安全问题。 从本质上说,ThreadLocal是...

    java多线程设计模式详解PDF及源码

    以上内容是Java多线程设计模式的核心知识点,通过阅读提供的"java多线程设计模式详解(PDF及源码)",你可以深入理解这些概念,并通过实际代码加深印象。学习这些模式和技巧将有助于编写出更加高效、稳定的多线程Java...

    Java多线程设计模式源代码

    Java多线程设计模式是Java编程中至关重要的一个领域,它涉及到如何在并发环境中高效、稳定地执行多个任务。在Java中,多线程可以提高应用程序的响应速度和整体性能,尤其是在处理I/O密集型或计算密集型任务时。本...

    java 简单的ThreadLocal示例

    Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,尤其在处理线程间数据隔离和共享时。ThreadLocal不是线程本身,而是为每个线程提供一个独立的变量副本,使得每个线程都可以独立地改变...

    java多线程设计模式源码

    Java多线程设计模式是构建高并发、高性能应用的关键技术之一。这些模式通过优化资源利用、提高程序可读性和可维护性,使并发编程更加高效和安全。以下将详细讲解标题和描述中涉及的一些核心知识点: 1. **线程池...

    java多线程高级设计模式详解

    Java多线程高级设计模式详解 在Java编程中,多线程是不可或缺的一部分,它能够充分利用多核处理器的计算能力,提高程序的并发性能。本文将深入探讨Java多线程中的高级设计模式,帮助开发者更好地理解和应用这些模式...

Global site tag (gtag.js) - Google Analytics