併發容器之 ThreadLocal 緩存

ThreadLocal是什麼

ThreadLocal是一個關於創建線程局部變量的類。是線程私有的。通常情況下,我們創建的變量是可以被任何一個線程訪問並修改的。而使用ThreadLocal創建的變量只能被當前線程訪問,其他線程則無法訪問和修改。

雖然ThreadLocal並不在java.util.concurrent包中而在java.lang包中,但更傾向於把它當作是一種併發容器(雖然真正存放數據的是ThreadLoclMap)進行歸類。從ThreadLocal這個類名可以顧名思義的進行理解,表示線程的“本地變量”,即每個線程都擁有該變量副本,達到人手一份的效果,各用各的這樣就可以避免共享資源的競爭。

在實際項目中我們需要將一些信息放到單個線程裏,比如,前端傳過來的token等。

用法

(1)ThreadLocal是支持泛型的,首先創建存儲的對象(若存儲的是基本數據類型,則不需要創建)

public class BaseSignatureRequest {
    private String token;
    private String userId;

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }
}

 (2)創建ThreadLocal變量

public class ThreadLocalCache {
    public static ThreadLocal<BaseSignatureRequest>
            baseSignatureRequestThreadLocal = new ThreadLocal<>();
}

(3)設置值

//token放入threadLocal
                BaseSignatureRequest baseSignatureRequest = new BaseSignatureRequest();
                baseSignatureRequest.setToken(String.valueOf(result.getData()));
                baseSignatureRequest.setUserId(userId);
                ThreadLocalCache.baseSignatureRequestThreadLocal.set(baseSignatureRequest);

(4)獲取值(用完後刪除,防止內存溢出)

BaseSignatureRequest baseSignatureRequest = ThreadLocalCache.baseSignatureRequestThreadLocal.get();
 //使用後清理ThreadLocal
ThreadLocalCache.baseSignatureRequestThreadLocal.remove();

原理

參考:http://con.zhangjikai.com/ThreadLocal.html

https://juejin.im/post/5aeeb22e6fb9a07aa213404a

https://droidyue.com/blog/2016/03/13/learning-threadlocal-in-java/

發佈了240 篇原創文章 · 獲贊 370 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章