首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ThreadLocal实现

ThreadLocal实现
EN

Stack Overflow用户
提问于 2009-09-29 11:42:43
回答 3查看 2.4K关注 0票数 1

关于我早些时候的问题,更进一步,

  1. 使用ThreadLocals而不是局部变量的缺点是什么?
  2. 它们是如何实现的
  3. 是会话变量ThreadLocals
  4. 是否有更多ThreadLocals经常使用的例子?
EN

回答 3

Stack Overflow用户

发布于 2009-09-29 12:02:02

我不确定我是否会说它是一个缺点,但是必须非常小心正确地清理ThreadLocals,因为您在那里放置的任何数据都在那里,只要线程存在,除非它被显式删除。在使用线程池重用线程的环境中,这特别麻烦,因此一些垃圾数据可能附加到线程,除非正确清理。

ThreadLocals实际上被大量使用--主要是由框架开发人员使用,因为他们允许将“上下文”附加到用户方法,而无需更改方法签名。例如,J2EE中的事务管理是用ThreadLocals完成的--对当前打开的事务的引用总是附加到线程上,因此当您使用数据库时,您将使用当前打开的事务自动访问它。如果没有ThreadLocal,则需要将这些引用作为方法参数传递。

这种用法还有许多其他的例子。我不确定您指的是哪些会话变量,但是类似会话的数据经常附加到ThreadLocal中。

关于执行-我真的不确定。我想我在某个地方读到了它是在JVM中实现的,它在相当低的级别上实现,以使性能非常快,因为今天很多代码都在使用它。

票数 1
EN

Stack Overflow用户

发布于 2009-09-29 11:54:05

  1. 劣势与什么相比?
  2. 作为一个Map<Thread,Value> --它实际上是一个附在线程上的映射,但更容易被认为是一个由线程键键决定的映射
  3. 不是
  4. ThreadLocals很少被使用,应该保持这种方式。

在我看来,应用程序开发人员使用ThreadLocal的唯一原因是,如果s/他需要经常使用非线程安全实用程序对象,它的构建成本(例如SimpleDateFormat)相对较高。即使如此,这也是个麻烦。

票数 0
EN

Stack Overflow用户

发布于 2009-09-29 12:21:48

一个真实的例子:AMQP消息传递协议允许多个多路逻辑连接(称为channel_s)共存在一个例如TCP/IP连接中。由于某些操作更改了逻辑连接的状态,因此需要将并发消息传递操作建模为并发通道上的操作。当您的并发模型被线程化时,您可以非常容易地通过用_ThreadLocal get()封装通道访问和用initialValue()覆盖打开通道来实现这一点。

春天框架的上下文中,您可以透明地使用适当的目标源来使用线程本地bean。

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

https://stackoverflow.com/questions/1492036

复制
相关文章

相似问题

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