ThreadLocal的目的是什么?

问题描述 投票:0回答:2
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不受线程安全保护?我知道“字符串”始终是线程安全的。

java concurrency thread-local
2个回答
0
投票

即使每个线程共享相同的Token实例,每个线程也会获得自己的VPattern。之所以这样做是因为Token不是线程安全的,并且VPattern要避免同步对Token实例的访问。 tokenKey_是最终的,因此不必担心字段更改,也许它本身就是线程安全的。 tokenLabel_也是最终的,字符串是不可变的,因此在那里没有问题。 cachedHashCode_是这里的奇数;对它的访问受到某种保护吗?在不看课程其余部分的情况下很难说发生了什么。


0
投票

[通常,ThreadLocal可以为每个工作线程提供不同的对象。因此,如果给定的对象不是线程安全的也不是单例的,则可以将其存储在ThreadLocal变量中。然后,每个线程都可以安全地使用类的不同实例。您可以将其视为地图,其中当前线程是键,而实际对象是值。

© www.soinside.com 2019 - 2024. All rights reserved.