2010-05-06 23 views

回答

96

因为如果它是一个实例级领域,那么它实际上是“每线程 - 每实例”,而不仅仅是一个保证“每线程”。这通常不是你正在寻找的语义。

通常它所持有类似的东西范围限定到用户会话对象,网络请求,等等。你不想让他们也分作用域的类的实例。
一个Web请求=>一个持久会话。
没有一个Web请求=>每个对象一个持久会话。

+1

我喜欢这个解释,因为它显示了如何使用ThreadLocal – kellyfj 2010-05-08 12:20:14

+3

每线程每实例可以是一个有用的语义,但大多数用于该模式的用途将涉及太多的对象,所以最好使用“ ThreadLocal'来保存一个对象映射到每个线程实例的散列集的引用。 – supercat 2014-03-17 23:03:03

+0

好的解释! – ADJ 2015-10-15 08:39:35

3

的原因是变量被经由与所述线程相关联的指针访问。它们像线程范围的全局变量一样工作,因此静态是最合适的。这是你在pthreads之类的东西中获得线程本地状态的方式,所以这可能只是历史和实现的一个意外。

9

它没有要。重要的是它应该是一个单身人士。

13

要么使其成为静态的,要么尝试避免类中的任何静态字段 - 使该类本身成为单例,然后只要您具有全局可用的单例,就可以安全地使用实例级别的ThreadLocal。

0

一个ThreadLocal的在每个线程A使用每个实例是,如果你想要的东西是在一个对象的所有方法可见,并且有它没有像你同步到它访问线程安全的就这么一个普通的领域。

相关问题