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

为什么Java ThreadLocal变量应该是静态的

白博易
2023-03-14
问题内容

我在这里阅读Threadlocal的JavaDoc

https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ThreadLocal.html

它说:“ ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段(例如,用户ID或事务ID)。”

但是我的问题是,为什么他们选择使其静态化(通常)-使其具有“每个线程”状态,但字段是静态的则有些令人困惑?


问题答案:

因为如果它是一个实例级字段,那么它实际上是“每个线程-每个实例”,而不仅仅是保证的“每个线程”。通常这不是您要查找的语义。

通常,它所保存的对象之类的对象仅限于用户对话,Web请求等。您不希望它们也被细分为类的实例。
一个Web请求=>一个Persistence会话。
没有一个Web请求=>每个对象一个持久性会话。



 类似资料:
  • 问题内容: 我是一位Java程序员,对公司领域来说是新手。最近,我已经使用Groovy和Java 开发了一个应用程序。我编写的所有代码都使用了大量的静态变量。高级技术人员要求我减少使用的静电数量。我已经在谷歌上搜索了相同的内容,并且发现许多程序员都反对使用静态变量。 我发现静态变量更易于使用。而且我认为它们也是有效的(如果我错了,请纠正我),因为如果我必须对一个类中的一个函数进行10,000次调用

  • 问题内容: 另外,在网上可以找到许多创建静态变量的解决方案。(尽管我还没有看到我喜欢的一个。) 为什么Python不支持方法中的静态变量?这被认为是非Python的,还是与Python的语法有关? 编辑: 我专门询问了 为什么 进行设计决策,但我没有提供任何代码示例,因为我想避免解释来模拟静态变量。 问题答案: 忽略这一点的想法是,静态变量仅在以下两种情况下才有用:何时真正应该使用类以及何时真正应

  • 问题内容: 如果将变量声明为,那么我可以从任意位置访问它。我还知道,静态成员由类的所有实例共享,并且不在每个实例中重新分配。 声明变量与声明变量有什么不同吗? 在这两种情况下,都不能以任何其他类或从任何其他类访问它。 将变量声明为静态是否会赋予它其他特殊属性? 问题答案: 当然,可以将其作为,但只能从定义它的类内部进行访问-这是因为它被定义为。 或变量通常用于常量。例如,许多人不喜欢在代码中“硬编

  • 问题内容: 静态变量是在程序执行的整个过程中分配的,因此堆栈和堆都不方便。那在哪呢 应该在某个地方加载它吗? 问题答案: 静态字段在加载类时被初始化,并且在卸载该类的类加载器时被丢弃。它们可以被清理,甚至可以在另一个类加载器中复制。 对于使用OSGi的此类应用程序,静态变量在整个应用程序生命周期中都不会存在,因此可以多次重装。 实现方式可能取决于JVM,但Sun / Oracle JVM创建一个“

  • 问题内容: 为什么默认情况下接口变量是静态变量和最终变量? 问题答案: 从Philip Shaw的Java接口设计常见问题解答中: 接口变量是静态的,因为无法单独实例化Java接口。必须在没有实例的静态上下文中分配变量的值。final修饰符确保分配给接口变量的值是一个真正的常量,不能由程序代码重新分配。

  • 问题内容: 在C / C ++中,我们使用静态局部变量来维护方法的状态。但是,为什么Java不支持它呢? 是的,我可以为此使用一个静态字段。但是创建一个仅维护一个方法状态的字段有点奇怪吗? 问题答案: 您已经找到了唯一的解决方案。 Java放弃了C ++的许多复杂性,这就是其中之一。 作用于函数的静态变量并发地对您造成麻烦(例如,正是由于这个原因,strtok是与pthread一起使用的著名的讨厌