ThreadLocal和InheritableThreadLocal的使用

今天在看一個開源項目的時候注意到InheritableThreadLocal類,以前接觸的通常都是ThreadLocal類。ThreadLocal這個類你們都比較熟悉。java

一句話解釋就是這個ThreadLocal存放的是各線程獨立的「對象數據」,各線程互不干擾,也不能共享訪問,避免併發問題。而InheritableThreadLocal要解決的是要在全部線程中全局共享同一個對象, 因此在當前線程上建立一個新的線程實例Thread時,會把這些線程變量從當前線程傳遞給新的線程實例(把父線程的數據傳遞給新線程)。(此時線程變量再也不線程安全,須要考慮線程安全問題) ,以前面試的時候問道多線程之間怎樣共享數據,方式其實有不少,好比:面試

一、共享存儲系統保存對象(redis緩存、文件形式等)redis

二、建立共享對象經過值傳遞給新的線程緩存

三、靜態變量的形式安全

四、多線程共用 Runnable對象多線程

如今看來是用InheritableThreadLocal也是不錯的一種方式。併發

ThreadLocal和InheritableThreadLocal的區別就是:ide

InheritableThreadLocal能夠獲取父級線程的內容,而ThreadLocal不能。.net

使用方式及源碼參考:線程

public class ThreadLocalContext extends InheritableThreadLocal<RequestContext> {

    private static final RequestIDGenerator requestIdGenerator = RequestIDGenerator.getInstance();
    private static final ThreadLocalContext instance = new ThreadLocalContext();

    @Override
    protected RequestContext initialValue() {
        return new RequestContext(requestIdGenerator.nextId());
    }

    public static HttpServletRequest getServletRequest() {
        return instance.get().getOriginRequest();
    }

    public static RequestContext getRequestContext() {
        return instance.get();
    }

    public static void clear() {
        instance.remove();
    }
}

下面是幾篇ThreadLocal和InheritableThreadLocal深刻介紹的文章,這裏就再也不深刻了。

Java 多線程:InheritableThreadLocal 實現原理

java concurrency in practice讀書筆記---ThreadLocal原理

相關文章
相關標籤/搜索