在“线程本地”中设置值:
//Class A holds the static ThreadLocal variable.
Class A{
public static ThreadLocal<X> myThreadLocal = new ThreadLocal<X>();
....
}
//A Class B method sets value in A's static ThreadLocal variable
class B{
{
public void someBmethod(){
X x = new X();
A.myThreadLocal.set(x);
}
}
//Class C retrieves the value set in A's Thread Local variable.
Class C {
public void someCMethod(){
X x = A.myThreadLocal.get();
}
...
}问题:
现在假设这是一个web应用程序,并且线程按照这个顺序执行: B.someBMethod,C.someCMethod。
执行B的someBMethod的多个线程最终将更新相同的A的静态ThreadLocal变量myThreadLocal,从而超出ThreadLocal变量的用途。(根据文档,对ThreadLocal使用静态是推荐的。)
C的someCMethod,在从ThreadLocal中检索值时,可能无法获得由“当前”线程设置的值。
我在这里错过了什么?
发布于 2013-04-27 07:55:39
根据ThreadLocal类的定义
这个类提供线程局部变量.这些变量与它们的正常对应变量不同,因为每个访问一个线程(通过其get或set方法)都有它自己的、独立初始化的变量副本。 ThreadLocal实例通常是希望将状态与线程相关联的类中的私有静态字段(例如,用户ID或事务ID)。
这意味着,假设两个线程t1和t2执行someBMethod(),它们最终分别设置x1 &x2(X实例)。现在,当t1来并执行someCMethod()时,它会得到x1 (这是由本身在之前设置的set ),t2则得到x2。
换句话说,拥有一个ThreadLocal的静态实例是安全的,因为在调用set时,它在内部执行类似的操作。
set(currentThread, value) //setting value against that particular thread当你调用
get(currentThread) //getting value for the thread发布于 2016-09-01 21:56:20
我研究了java 源代码,
java.lang.Thread Class包含一个实例变量,如下所示。
ThreadLocal.ThreadLocalMap threadLocals = null;因为threadLocals变量是非静态,所以应用程序中的每个线程(即线程类的每个实例)都有自己的复制 of threadLocals映射。
ThreadLocal.get()获取值时,在内部,它将从ThreadLocalMap of 当前线程中获取。简单地说,是,您从当前的线程对象获取和设置值,从ThreadLocal对象获取而不是。
发布于 2013-04-27 07:55:03
执行B的someBMethod的多个线程,最终将更新相同的A的静态ThreadLocal变量myThreadLocal
是的,它们在同一个物体上工作。但是,重要的是要认识到,ThreadLocal的工作方式是每个线程都有自己的、独立的值。因此,如果有十个线程写入myThreadLocal,然后从myThreadLocal读取,每个线程都会看到正确的(即它们自己的)值。
换句话说,哪个类或对象写入ThreadLocal实例并不重要。重要的是在哪个线程中执行操作。
https://stackoverflow.com/questions/16249687
复制相似问题