ThreadLocal的一些自己的理解

2021-07-25 03:06:44 字數 2372 閱讀 1310

有關於threadlocal的原理的源**解釋在下面已經說的很清楚了 源**也很清晰易懂

個人對於threadlocal類的一些總結:

1.threadlocal類並不是將執行緒和所儲存的物件進行鍵值儲存的和進行取值的(這是我第一反應以為的)

而是將儲存的值儲存到對應thread物件的threadlocalmap裡,threadlocalmap的實現原理類似於hashmap,

內部有乙個entry陣列,乙個entry通常至少包括key,value, 查詢時通過一定的運算規則運算key的hash值,來得到entry在陣列中的位置,進而得到相應的value。

但是這個threadlocalmap是將當前threadlocal物件例項傳入當作鍵值,將set的物件當value值進行儲存

下面是threadlocal的set方法原始碼

public void set(t value)

我們進map的set裡看看

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();

}

取值時也根據對應的thread物件拿出自己的threadlocalmap,再根據threadlocal的例項為鍵值得到對應本執行緒本threadlocal的副本

public t get() 

return setinitialvalue();

}

每個threadlocalmap對應每個執行緒只能儲存乙個物件

也就是說你set了乙個物件a,再放入物件b ,物件b就會把物件a取代 這就跟hashmap一樣 

因為threadlocal是鍵值.。通過以上的**也能看出來 

3.先看一段**

public class test

}class mythread implements runnable

@override

public void run()

catch (interruptedexception e)

}system.out.println("執行緒為"+thread.currentthread().getid()+"原來的:"+t.i);

t.i = obj;//改變值

system.out.println("執行緒為"+thread.currentthread().getid()+"現在的:"+((test)get()).i);

system.out.println("執行緒為"+thread.currentthread().getid()+"所儲存的物件:"+get()); }

public object get()

}

此時輸出如下:

執行緒為9原來的:1

執行緒為9現在的:2

執行緒為9所儲存的物件:threadlocaltest.test@65b8b5cd

執行緒為10原來的:2

執行緒為10現在的:3

執行緒為10所儲存的物件:threadlocaltest.test@65b8b5cd

我在兩個執行緒放入了同乙個test物件test,當然run方法裡也set了這個test

像我剛開始以為threadlocal會自動為每個執行緒建立乙個副本(好可笑的夢哈)

這段**也證實了並不會。

所以並不是由threadlocal給你轉殖副本,而是由你自己來設定放進去的副本

如果將注釋的**代替

則輸出如下:

執行緒為9原來的:1

執行緒為9現在的:2

執行緒為9所儲存的物件:threadlocaltest.test@65b8b5cd

執行緒為10原來的:1

執行緒為10現在的:3

執行緒為10所儲存的物件:threadlocaltest.test@72d2ee5d

上面囉嗦一大堆 就是為了讓我自己認識到threadlocal需要自己來設定對應每個執行緒的副本

而這就需要執行threadlocal的set方法 或者重寫threadlocal的initialvalue方法

如同下面這樣:

static threadlocalt =  new threadlocal()

};

linux開機自啟服務的一些技巧

1 自啟動服務的重要性 1 需要手動新增希望的自啟服務,如安裝svn後沒有自動新增,需要我們手動加入 2 安裝某些程式後,自動加到自啟動了,但我們不需要,需要手動移除 3 很多惡意程式都會把自己加入自啟動,需要我們排查刪除 2 執行級別的原理 etc rc.d rc 0 6 d 這7個目錄,代表 l...

SLAM的一些名詞解釋 自看

iterative closest point,迭代最近點演算法。假設有a與b兩幀點雲,將b做t0變換變成b1,再在b1中利用k d tree找到a中所有點的對應點。由所有對應點之間歐氏距離的平方和來作為評價函式,不斷迭代,使得評價函式降低,最終將收斂於實際變換t的近似值。特點 耗時,在場景變化小的...

關於自增自減運算子的一些問題

1 作用是使變數的值增1 或減1。例如 i,i 在使用i之前,先使i的值加 減 1 i i 在使用i之後,使i的值加 減 1 其中 i和i 的作用相當於i i 1。但是 i和i 不同之處在於 i是先執行i i 1後,再使用i的值 而i 是先使用i的值後,再執行i i 1。如果i的原值等於3,請分析下...