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是解决线程安全问题的一个重要工具,它提供了一种在多线程环境下为每个线程维护独立变量副本的方法,从而避免了共享状态带来的竞态条件和线程安全问题。 线程安全问题通常由全局变量和静态变量...
- ThreadLocal并不是解决所有线程安全问题的万能药,它主要用于隔离线程间的变量状态,而非同步控制。 - 不要将ThreadLocal用作全局变量,因为它们只在创建它们的线程内有效,无法跨线程共享。 - 谨慎处理生命...
Java 非线程安全类变线程安全类 Java 中的非线程安全类是指有状态的类,即有属性的类,这些类在多线程...Java 中的非线程安全类可以通过使用 ThreadLocal 或 synchronized 关键字来实现线程安全,避免线程安全问题。
3. **使用线程局部变量**:Java的`ThreadLocal`类可以为每个线程创建独立的变量副本,避免了线程间的冲突。 4. **设计无状态的Servlet**:Servlet不保留任何用户请求之间的状态,每次请求都是独立的,这样的Servlet...
在C#中,实现线程安全通常有几种策略:锁(Lock)、Monitor、Mutex、Semaphore以及线程局部存储(ThreadLocal)等。 这个压缩包中的"TestConsoleApp"很可能是一个演示程序,展示了如何使用封装好的线程安全日志类。在...
ThreadLocal变量是另一种保证线程安全的方法,它为每个线程提供了一个变量的副本,使得每个线程都可以独立地修改自己的副本,而不会影响其他线程。ThreadLocal适用于那种线程间不需要共享数据,或者共享的数据需要以...
8. 线程局部变量(ThreadLocal):为每个线程创建独立的变量副本,避免了线程安全问题,但要注意,ThreadLocal变量会在线程结束时被垃圾回收,如果不及时清理可能导致内存泄漏。 测试线程安全通常包括模拟并发环境...
**线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...
目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date日期转String类型(format)SimpleDateFormat出现...注意事项使用ThreadLocal解决SimpleDateFormat线程安全问题总结...
测试可能包括对局部变量的读写操作,以及涉及到同步机制如synchronized关键字,volatile修饰符,或者是使用ThreadLocal等技术来确保线程安全。 在标签中,“局部变量”、“线程”、“安全”、“测试”和“源码”是...
- 不是线程安全的:尽管ThreadLocal提供了线程隔离,但它本身并不保证线程安全性,如果在`set`和`get`操作之间有其他线程修改了ThreadLocal实例,仍需进行同步控制。 在使用ThreadLocal时,理解其工作原理和限制是...
4. **线程局部变量**:每个线程都有自己的副本,不会造成数据冲突,如`ThreadLocal`类。 ### 三、线程安全策略 1. **同步机制**:包括`synchronized`关键字、`Lock`接口(如`ReentrantLock`)以及`java.util....
4. ** ThreadLocal**:创建线程局部变量,每个线程都有自己独立的副本,避免了线程间的数据共享问题。 5. ** Interlocked 类**:提供原子操作,如`Interlocked.Increment`,用于线程安全的计数操作。 6. **并发...
- **线程局部变量**:如果可能,使用`ThreadLocal`来存储线程相关的状态,可以避免线程间的数据冲突。 - **无状态对象**:设计无状态的`Action`,即对象不包含任何可变状态,可以使对象天然线程安全。 - **同步...
5. **ThreadLocal**:每个线程都有自己的副本,不会产生线程安全问题,但要注意内存泄漏。 了解了这些基本机制后,我们可以通过`jconsole`、`jvisualvm`等工具进行线程监控,查看线程状态、死锁检测等,辅助排查和...
- 此外,还可以使用`ThreadLocal`等机制来保证线程安全。 综上所述,Struts1、Struts2和WebWork这三个框架都面临着线程安全问题,但在Struts2中这个问题得到了较好的解决。Struts2通过使用“prototype”作用域管理...
3. **线程安全的服务对象**:当一个服务对象需要在多个方法中被共享但又要求线程安全时,ThreadLocal可以为每个线程创建独立的服务对象副本,避免并发问题。 4. **缓存**:ThreadLocal可以用于实现线程级别的缓存,...