当前位置: 首页 > 面试题库 >

Java ThreadLocal静态吗?

苏彦君
2023-03-14
问题内容

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

//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的多个线程最终将更新 SAME
A的静态ThreadLocal变量myThreadLocal,从而超出了ThreadLocal变量的目的。(根据文档建议在ThreadLocal中使用static。)

C的someCMethod从ThreadLocal检索值时,可能无法获取“当前”线程设置的值。

我在这里想念什么?


问题答案:

按照ThreadLocal类的定义

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

这意味着说2个线程t1t2执行someBMethod(),它们分别结束设置x1x2(的实例X)。现在,当t1come并执行时,someCMethod()它会获取x1(它是由
它自己* 设置 的)和gets 。 *t2``x2

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

set(currentThread, value) //setting value against that particular thread

当您调用get

get(currentThread) //getting value for the thread


 类似资料:
  • 问题内容: 直到几周前,我还以为我知道何时创建字段和方法或。例如,当一个字段(例如另一个类的对象)对于该类的任意数量的对象是唯一的时,应将其设置为。 但是几周后,我读到了有关JVM垃圾收集的信息。 我知道字段永远不会被垃圾收集,并且始终保持在内存中,除非类加载器本身是垃圾收集的。 但是,如果我不创建该字段,至少它将被垃圾回收。 因此,在使字段/方法静态化与否之间似乎有一条 很细的界限 。 有人可以

  • 本文向大家介绍JavaThreadLocal Java 8功能初始化,包括了JavaThreadLocal Java 8功能初始化的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 只是为了澄清我正在考虑的这个权利,在Java中,静态字段是整个类使用的变量/字段,还是可以用于引用该类的所有对象?非静态字段是由对象定义的变量吗?并且与对象1引用相同类的第二个对象可以具有与对象1的静态字段不同的值吗? 问题答案: 与实例变量不同,在创建该类的实例之前,可以访问该类中的静态字段或静态类变量。在运行时创建该类的实例时,将创建该类中的实例变量(非静态变量)。因此,直到创建该

  • 我想澄清一下,在java中,静态字段是整个类使用的变量/字段,或者可以被引用该类的所有对象使用?非静态字段是由对象定义的变量?第二个对象引用与对象1相同的类,它可以对对象1的静态字段具有不同的值?

  • 我的程序有问题。Eclipse写道: 我做错了什么?我的应用程序中有2个错误。班你能改进我的代码并解释一下吗?先谢谢你。 多边形 地聚线

  • 我们可以把一个方法赋值给类的函数本身,而不是赋给它的 "prototype"。这样的方法被称为 静态的(static)。 在一个类中,它们以 static 关键字开头,如下所示: class User { static staticMethod() { alert(this === User); } } User.staticMethod(); // true 这实际上跟直接将其

  • 问题内容: 在Linux上的“ C”上, 我需要静态库来静态链接,还是需要足够的共享库?如果没有,为什么不呢?(它们不包含相同的数据吗?) 问题答案: 是的,您需要静态库来构建静态链接的可执行文件。 静态库是编译对象的捆绑包。静态链接到库时,实际上与获取该库的编译结果,将它们解压缩到当前项目中以及将它们当作自己的对象使用一样。 动态库已链接。这意味着一些信息,例如重定位,已经被修复并丢弃。 此外,

  • ThinkCMF5默认的静态后缀是 html,您可以在后台 url 设置里设置静态后缀