簡體   English   中英

ThreadLocal的目的是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM