关于我早些时候的问题,更进一步,
发布于 2009-09-29 12:02:02
我不确定我是否会说它是一个缺点,但是必须非常小心正确地清理ThreadLocals,因为您在那里放置的任何数据都在那里,只要线程存在,除非它被显式删除。在使用线程池重用线程的环境中,这特别麻烦,因此一些垃圾数据可能附加到线程,除非正确清理。
ThreadLocals实际上被大量使用--主要是由框架开发人员使用,因为他们允许将“上下文”附加到用户方法,而无需更改方法签名。例如,J2EE中的事务管理是用ThreadLocals完成的--对当前打开的事务的引用总是附加到线程上,因此当您使用数据库时,您将使用当前打开的事务自动访问它。如果没有ThreadLocal,则需要将这些引用作为方法参数传递。
这种用法还有许多其他的例子。我不确定您指的是哪些会话变量,但是类似会话的数据经常附加到ThreadLocal中。
关于执行-我真的不确定。我想我在某个地方读到了它是在JVM中实现的,它在相当低的级别上实现,以使性能非常快,因为今天很多代码都在使用它。
发布于 2009-09-29 11:54:05
Map<Thread,Value> --它实际上是一个附在线程上的映射,但更容易被认为是一个由线程键键决定的映射在我看来,应用程序开发人员使用ThreadLocal的唯一原因是,如果s/他需要经常使用非线程安全实用程序对象,它的构建成本(例如SimpleDateFormat)相对较高。即使如此,这也是个麻烦。
发布于 2009-09-29 12:21:48
一个真实的例子:AMQP消息传递协议允许多个多路逻辑连接(称为channel_s)共存在一个例如TCP/IP连接中。由于某些操作更改了逻辑连接的状态,因此需要将并发消息传递操作建模为并发通道上的操作。当您的并发模型被线程化时,您可以非常容易地通过用_ThreadLocal get()封装通道访问和用initialValue()覆盖打开通道来实现这一点。
在春天框架的上下文中,您可以透明地使用适当的目标源来使用线程本地bean。
https://stackoverflow.com/questions/1492036
复制相似问题