[英]What's the purpose of ThreadLocal here?
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不受線程安全保護? 我知道“字符串”始終是線程安全的。
即使每個線程共享相同的VPattern
實例,每個線程也會獲得自己的Token
。 之所以這樣做是因為Token
不是線程安全的,並且VPattern
希望避免同步對Token
實例的訪問。 tokenKey_
是最終的,因此不必擔心字段更改,並且它本身可能是線程安全的。 tokenLabel_
也是最終的,字符串是不可變的,因此在那里沒有問題。 cachedHashCode_
是這里的奇數; 對它的訪問受到某種保護嗎? 在不看課程其余部分的情況下很難說發生了什么。
通常, ThreadLocal
可以為每個工作線程提供不同的對象。 因此,如果給定的對象不是線程安全的也不是單例的,則可以將其存儲在ThreadLocal
變量中。 然后,每個線程都可以安全地使用類的不同實例。 您可以將其視為地圖,其中當前線程是鍵,而實際對象是值。
假設有兩個線程同時工作並共享一個VPattern
對象。 如果線程獲得tokenKey_
或tokenLabel_
,則兩者將獲得相同的實例。 但是,如果兩個線程都調用token.get()
,則它們將獲得Token
類型的不同實例(如果先前已初始化,請參見: set
方法和withInitial
靜態工廠方法)。
不幸的是,很難說ThreadLocal
的目的是什么,因為它高度依賴於上下文。 似乎Token
對象不能由不同的線程共享(每個線程應具有自己的令牌)。
您可以在javadoc或此處閱讀有關ThreadLocal
更多信息: https : //www.baeldung.com/java-threadlocal
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.