有關於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,請分析下...