public class VPattern implements Pattern
{
private final TokenKey tokenKey_;
private final String tokenLabel_;
private Integer cachedHashCode_ = null;
private ThreadLocal<Token> token_ = new ThreadLocal<Token>();
...
}
我正在阅读这段代码,在这里不了解ThreadLocal的用法。那是因为ThreadLocal用于确保'token_'对象在任何并发情况下都是线程安全的吗?如果是这样,为什么TokenKey和Integer不受线程安全保护?我知道“字符串”始终是线程安全的。
即使每个线程共享相同的Token
实例,每个线程也会获得自己的VPattern
。之所以这样做是因为Token
不是线程安全的,并且VPattern
要避免同步对Token
实例的访问。 tokenKey_
是最终的,因此不必担心字段更改,也许它本身就是线程安全的。 tokenLabel_
也是最终的,字符串是不可变的,因此在那里没有问题。 cachedHashCode_
是这里的奇数;对它的访问受到某种保护吗?在不看课程其余部分的情况下很难说发生了什么。
[通常,ThreadLocal
可以为每个工作线程提供不同的对象。因此,如果给定的对象不是线程安全的也不是单例的,则可以将其存储在ThreadLocal
变量中。然后,每个线程都可以安全地使用类的不同实例。您可以将其视为地图,其中当前线程是键,而实际对象是值。