首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java ThreadLocal静态?

Java ThreadLocal静态?
EN

Stack Overflow用户
提问于 2013-04-27 07:51:01
回答 5查看 29.6K关注 0票数 28

在“线程本地”中设置值:

代码语言:javascript
复制
//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中检索值时,可能无法获得由“当前”线程设置的值。

我在这里错过了什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-27 07:55:39

根据ThreadLocal类的定义

这个类提供线程局部变量.这些变量与它们的正常对应变量不同,因为每个访问一个线程(通过其get或set方法)都有它自己的、独立初始化的变量副本。 ThreadLocal实例通常是希望将状态与线程相关联的类中的私有静态字段(例如,用户ID或事务ID)。

这意味着,假设两个线程t1t2执行someBMethod(),它们最终分别设置x1 &x2(X实例)。现在,当t1来并执行someCMethod()时,它会得到x1 (这是由本身在之前设置的set ),t2则得到x2

换句话说,拥有一个ThreadLocal的静态实例是安全的,因为在调用set时,它在内部执行类似的操作。

代码语言:javascript
复制
set(currentThread, value) //setting value against that particular thread

当你调用

代码语言:javascript
复制
get(currentThread) //getting value for the thread
票数 72
EN

Stack Overflow用户

发布于 2016-09-01 21:56:20

我研究了java 源代码

  1. java.lang.Thread Class包含一个实例变量,如下所示。 ThreadLocal.ThreadLocalMap threadLocals = null;

因为threadLocals变量是非静态,所以应用程序中的每个线程(即线程类的每个实例)都有自己的复制 of threadLocals映射。

  1. 此映射的当前 ThreadLocal实例,是作为参数传递给ThreadLocal.set()的值。
  2. 当您尝试将作为ThreadLocal.get()获取值时,在内部,它将从ThreadLocalMap of 当前线程中获取。

简单地说,,您从当前的线程对象获取和设置值,从ThreadLocal对象获取而不是

票数 10
EN

Stack Overflow用户

发布于 2013-04-27 07:55:03

执行B的someBMethod的多个线程,最终将更新相同的A的静态ThreadLocal变量myThreadLocal

是的,它们在同一个物体上工作。但是,重要的是要认识到,ThreadLocal的工作方式是每个线程都有自己的、独立的值。因此,如果有十个线程写入myThreadLocal,然后从myThreadLocal读取,每个线程都会看到正确的(即它们自己的)值。

换句话说,哪个类或对象写入ThreadLocal实例并不重要。重要的是在哪个线程中执行操作。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16249687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档