今天在看一個開源項目的時候注意到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深刻介紹的文章,這裏就再也不深刻了。