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

ThreadLocal线程安全的奥秘

 
阅读更多

ThreadLocal,存储线程内部的数据,线程独享,没有线程安全问题,它是如何做到这些的呢?原因就是数据存储在Thread实例中,每一个Thread的实例拥有ThreadLocal.ThreadLocalMap threadLocals 成员,该成员是包共享的。ThreadLocal的set方法把数据存储在当前线程的threadLocals map中,保证每个线程数据的独立。

Thread 代码:

/* ThreadLocal values pertaining to this thread
 * by the ThreadLocal class. */                
ThreadLocal.ThreadLocalMap threadLocals = null;

ThreadLocal set 代码:

/**                                                                    
 * Sets the current thread's copy of this thread-local variable        
 * to the specified value.  Most subclasses will have no need to       
 * override this method, relying solely on the {@link #initialValue}   
 * method to set the values of thread-locals.                          
 *                                                                     
 * @param value the value to be stored in the current thread's copy of 
 *        this thread-local.                                           
 */                                                                    
public void set(T value) {                                             
    Thread t = Thread.currentThread();                                 
    ThreadLocalMap map = getMap(t);                                    
    if (map != null)                                                   
        map.set(this, value);                                          
    else                                                               
        createMap(t, value);                                           
}                                                                      

ThreadLocal的初始化化方法: protected T initialValue()

缺省返回null,可以被override,线程第一次使用 get() 方法访问变量时将调用此方法,但如果线程之前调用了 set(T) 方法,则不会对该线程再调用 initialValue 方法。通常,此方法对每个线程最多调用一次,但如果在调用 get() 后又调用了 remove(),则可能再次调用此方法。

ThreadLocal的get方法:

/**                                                              
 * 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 map = getMap(t);                              
    if (map != null) {                                           
        ThreadLocalMap.Entry e = map.getEntry(this);             
        if (e != null)                                           
            return (T)e.value;                                   
    }                                                            
    return setInitialValue();                                    
}   
*                                  
 * @param  t the current thread     
 * @return the map                  
 */                                 
ThreadLocalMap getMap(Thread t) {   
    return t.threadLocals;          
}                                                                                                
分享到:
评论

相关推荐

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

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

    Java ThreadLocal 线程安全问题解决方案

    Java中的ThreadLocal是解决线程安全问题的一个重要工具,它提供了一种在多线程环境下为每个线程维护独立变量副本的方法,从而避免了共享状态带来的竞态条件和线程安全问题。 线程安全问题通常由全局变量和静态变量...

    ThreadLocal 线程本地变量 及 源码分析.rar_开发_设计

    - ThreadLocal并不是解决所有线程安全问题的万能药,它主要用于隔离线程间的变量状态,而非同步控制。 - 不要将ThreadLocal用作全局变量,因为它们只在创建它们的线程内有效,无法跨线程共享。 - 谨慎处理生命...

    Java非线程安全类变线程安全类.pdf

    Java 非线程安全类变线程安全类 Java 中的非线程安全类是指有状态的类,即有属性的类,这些类在多线程...Java 中的非线程安全类可以通过使用 ThreadLocal 或 synchronized 关键字来实现线程安全,避免线程安全问题。

    servlet与Struts action线程安全问题分析

    3. **使用线程局部变量**:Java的`ThreadLocal`类可以为每个线程创建独立的变量副本,避免了线程间的冲突。 4. **设计无状态的Servlet**:Servlet不保留任何用户请求之间的状态,每次请求都是独立的,这样的Servlet...

    C# 高效线程安全,解决多线程写txt日志类.zip

    在C#中,实现线程安全通常有几种策略:锁(Lock)、Monitor、Mutex、Semaphore以及线程局部存储(ThreadLocal)等。 这个压缩包中的"TestConsoleApp"很可能是一个演示程序,展示了如何使用封装好的线程安全日志类。在...

    构建线程安全应用程序

    ThreadLocal变量是另一种保证线程安全的方法,它为每个线程提供了一个变量的副本,使得每个线程都可以独立地修改自己的副本,而不会影响其他线程。ThreadLocal适用于那种线程间不需要共享数据,或者共享的数据需要以...

    java线程安全测试

    8. 线程局部变量(ThreadLocal):为每个线程创建独立的变量副本,避免了线程安全问题,但要注意,ThreadLocal变量会在线程结束时被垃圾回收,如果不及时清理可能导致内存泄漏。 测试线程安全通常包括模拟并发环境...

    ThreadLocal应用示例及理解

    **线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...

    ThreadLocal:如何优雅的解决SimpleDateFormat多线程安全问题

    目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date日期转String类型(format)SimpleDateFormat出现...注意事项使用ThreadLocal解决SimpleDateFormat线程安全问题总结...

    局部变量线程安全测试

    测试可能包括对局部变量的读写操作,以及涉及到同步机制如synchronized关键字,volatile修饰符,或者是使用ThreadLocal等技术来确保线程安全。 在标签中,“局部变量”、“线程”、“安全”、“测试”和“源码”是...

    ThreadLocal

    - 不是线程安全的:尽管ThreadLocal提供了线程隔离,但它本身并不保证线程安全性,如果在`set`和`get`操作之间有其他线程修改了ThreadLocal实例,仍需进行同步控制。 在使用ThreadLocal时,理解其工作原理和限制是...

    java线程安全总结.doc

    4. **线程局部变量**:每个线程都有自己的副本,不会造成数据冲突,如`ThreadLocal`类。 ### 三、线程安全策略 1. **同步机制**:包括`synchronized`关键字、`Lock`接口(如`ReentrantLock`)以及`java.util....

    c#线程安全的源代码示例

    4. ** ThreadLocal**:创建线程局部变量,每个线程都有自己独立的副本,避免了线程间的数据共享问题。 5. ** Interlocked 类**:提供原子操作,如`Interlocked.Increment`,用于线程安全的计数操作。 6. **并发...

    Action是否线程安全

    - **线程局部变量**:如果可能,使用`ThreadLocal`来存储线程相关的状态,可以避免线程间的数据冲突。 - **无状态对象**:设计无状态的`Action`,即对象不包含任何可变状态,可以使对象天然线程安全。 - **同步...

    Java多线程 - (一) 最简单的线程安全问题

    5. **ThreadLocal**:每个线程都有自己的副本,不会产生线程安全问题,但要注意内存泄漏。 了解了这些基本机制后,我们可以通过`jconsole`、`jvisualvm`等工具进行线程监控,查看线程状态、死锁检测等,辅助排查和...

    struts1,struts2,webwork,线程安全问题

    - 此外,还可以使用`ThreadLocal`等机制来保证线程安全。 综上所述,Struts1、Struts2和WebWork这三个框架都面临着线程安全问题,但在Struts2中这个问题得到了较好的解决。Struts2通过使用“prototype”作用域管理...

    Java多线程编程之ThreadLocal线程范围内的共享变量

    3. **线程安全的服务对象**:当一个服务对象需要在多个方法中被共享但又要求线程安全时,ThreadLocal可以为每个线程创建独立的服务对象副本,避免并发问题。 4. **缓存**:ThreadLocal可以用于实现线程级别的缓存,...

Global site tag (gtag.js) - Google Analytics