我使用的是ThreadLocal
变量(通过Clojure的变量,但以下内容与Java中的原始ThreadLocal
相同),并且经常遇到以下问题:我无法确定某个代码路径将采取同一个线程或另一个线程。对于我的控制下的代码来说,这显然不是一个太大的问题,但对于多态第三方代码,有时甚至没有办法静态确定是否安全地假设单线程执行。难以使用的ThreadLocals
我倾向于认为这是一个固有的问题ThreadLocal
s,但我想听听一些建议如何以安全的方式使用它们。
我使用的是ThreadLocal
变量(通过Clojure的变量,但以下内容与Java中的原始ThreadLocal
相同),并且经常遇到以下问题:我无法确定某个代码路径将采取同一个线程或另一个线程。对于我的控制下的代码来说,这显然不是一个太大的问题,但对于多态第三方代码,有时甚至没有办法静态确定是否安全地假设单线程执行。难以使用的ThreadLocals
我倾向于认为这是一个固有的问题ThreadLocal
s,但我想听听一些建议如何以安全的方式使用它们。
然后不要使用ThreadLocals!当你想要一个与Thread相关的变量时,它们特别适用于你,就好像有一个Map<Thread,T>
。
答案很简单!我会为你+1,但不幸的是我今天的选票全部没有了。 – Bombe 2009-12-03 14:37:46
ThreadLocal的典型用例(据我所知)是在一个Web应用程序框架中。 HTTP筛选器在传入请求上获取数据库连接,并将连接存储在静态ThreadLocal中。所有后续需要连接的控制器都可以使用静态调用从框架轻松获得。当返回响应时,同一个过滤器再次释放连接。
你的代码和具体问题在哪里? – 2009-12-03 14:32:02
如果你的官僚本能告诉你这是社区wiki,请随意标记我的问题。 – pmf 2009-12-03 14:46:16
我不明白这个问题,ThreadLocal与多线程代码一起使用。如果你可以假设单线程执行使用局部变量... – pgras 2009-12-03 15:22:51