ThreadLocal深度剖析

2021-09-22 16:36:06 字數 1995 閱讀 2182

threadlocal作用:

為每個執行緒建立乙個副本,然後當前執行緒修改了該副本的值後而不會影響其他執行緒的值,各個變數之間相互不影響。注意:每個執行緒在獲取例項中的值時,必須先對改值進行初始化,否知獲得的值為null。

**示例如下:

public class threadlocaltest 

}

執行結果如下:

threadlocal 類圖結構如下:

原始碼中的定義:

1 static final class suppliedthreadlocal extends threadlocal,suppliedthreadlocal是threadlocal的靜態內部類。

2 static class threadlocalmap,threadlocalmap也是threadlocal的靜態內部類。

3 static class entry extends weakreference> ,entry 是 threadlocalmap的靜態內部類。

threadlocal原始碼分析:

我們先來看下threadlocal的主要方法實現:

1 threadlocal中set(t value) 方法解析如下:

public void set(t value) 

//根據當前執行緒獲取當前執行緒的threadlocalmap

threadlocalmap getmap(thread t)

//key為threadlocal例項,value為設定的值,將key-value放入entry中。

private void set(threadlocal> key, object value)

if (k == null)

}tab[i] = new entry(key, value);

int sz = ++size;

if (!cleansomeslots(i, sz) && sz >= threshold)

rehash();

}//如果當前執行緒的threadlocalmap

void createmap(thread t, t firstvalue)

threadlocalmap(threadlocal> firstkey, object firstvalue)

2 threadlocal中get()方法解析如下:

public t get() 

}return setinitialvalue();

}// 對threadlocal進行初始化,如果沒有在**中顯示設定,則setinitialvalue() 的返回值為null。

private t setinitialvalue()

protected t initialvalue()

threadlocal 記憶體洩漏:先來看下threadlocal.threadlocalmap.entry 的類圖結構:

原始碼中的定義如下:

static class entry extends weakreference> 

}

public void remove() 

private void remove(threadlocal> key) }}

ifdef cplusplus深度剖析

時常在cpp的 之中看到這樣的 ifdef cplusplus extern c endif 這樣的 到底是什麼意思呢?首先,cplusplus是cpp中的自定義巨集,那麼定義了這個巨集的話表示這是一段cpp的 也就是說,上面的 的含義是 如果這是一段cpp的 那麼加入extern c 處理其中的 ...

深度剖析ostream

雖然c 學了大半個月了,自己學了解了很多關於c 的知識,大的概念懂了不少,但是還是想說想要徹底的弄懂c 絕非易事。當別人問到乙個很小的知識點些許你都要愣很久,事實告訴我們不能太好高騖遠。為什麼要寫ostream而不是istream,因為當我們自定義型別 student類 的時候,如果需要輸出 stu...

MapReduce 深度剖析

mapreduce 深度剖析 在hadoop2.x大行其道的年代,其優秀的資源管理框架 系統 高可用的分布式儲存系統,備受企業青睞。然因上述之惑,往往不能盡得其中之深意。此篇部落格筆者為大家一一解惑。雖說我們能夠編寫乙個完成mapreduce程式,並執行它。然其執行的細節,我們卻未必清楚,往往初學者...