我读的JavaDoc的ThreadLocal这里为什么Java的ThreadLocal的变量是静态的
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ThreadLocal.html
,它说 “ThreadLocal实例类,它们希望将状态与某一个线程通常私有静态字段(例如,用户ID或交易ID)。“
但我的问题是为什么他们选择使它静态(通常) - 它使事情有点混乱,有”每线程“的状态,但字段是静态的?
我读的JavaDoc的ThreadLocal这里为什么Java的ThreadLocal的变量是静态的
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ThreadLocal.html
,它说 “ThreadLocal实例类,它们希望将状态与某一个线程通常私有静态字段(例如,用户ID或交易ID)。“
但我的问题是为什么他们选择使它静态(通常) - 它使事情有点混乱,有”每线程“的状态,但字段是静态的?
因为如果它是一个实例级领域,那么它实际上是“每线程 - 每实例”,而不仅仅是一个保证“每线程”。这通常不是你正在寻找的语义。
通常它所持有类似的东西范围限定到用户会话对象,网络请求,等等。你不想让他们也分作用域的类的实例。
一个Web请求=>一个持久会话。
没有一个Web请求=>每个对象一个持久会话。
的原因是变量被经由与所述线程相关联的指针访问。它们像线程范围的全局变量一样工作,因此静态是最合适的。这是你在pthreads之类的东西中获得线程本地状态的方式,所以这可能只是历史和实现的一个意外。
它没有要。重要的是它应该是一个单身人士。
要么使其成为静态的,要么尝试避免类中的任何静态字段 - 使该类本身成为单例,然后只要您具有全局可用的单例,就可以安全地使用实例级别的ThreadLocal。
一个ThreadLocal的在每个线程A使用每个实例是,如果你想要的东西是在一个对象的所有方法可见,并且有它没有像你同步到它访问线程安全的就这么一个普通的领域。
我喜欢这个解释,因为它显示了如何使用ThreadLocal – kellyfj 2010-05-08 12:20:14
每线程每实例可以是一个有用的语义,但大多数用于该模式的用途将涉及太多的对象,所以最好使用“ ThreadLocal'来保存一个对象映射到每个线程实例的散列集的引用。 – supercat 2014-03-17 23:03:03
好的解释! – ADJ 2015-10-15 08:39:35