ThreadLocal的使用就是宁昭,你在一個(gè)類中定義了這么類型的一個(gè)變量秸架,不同的線程環(huán)境中g(shù)et揍庄,set使用這個(gè)變量,會(huì)在各自的線程環(huán)境中保存各自的值东抹。可以通過重寫initialValue()為這個(gè)變量賦予初始值沃测,默認(rèn)為null缭黔。
ThreadLocal是如何各個(gè)線程都有自己對(duì)應(yīng)于這個(gè)變量的值的呢?如果是你蒂破,你會(huì)怎么去實(shí)現(xiàn)呢馏谨?
java的設(shè)計(jì)是:ThreadLocalMap去真正的保存和存儲(chǔ)值,每個(gè)線程都有自己的ThreadLocalMap附迷。通過ThreadLocal的實(shí)例作為key去映射到對(duì)應(yīng)的entry惧互。
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
這里為什么要放出Entry的源碼,因?yàn)檫@里有一個(gè)指的思考的地方:為什么對(duì)key(ThreadLocal)使用弱引用喇伯?因?yàn)門hreadLocalMap都是線程持有的喊儡,強(qiáng)引用會(huì)導(dǎo)致ThreadLocal的泄漏。如果還用了匿名內(nèi)部類的方式使用了ThreadLocal那將導(dǎo)致更多對(duì)象的泄漏稻据!
最后艾猜,ThreadLocal還有一個(gè)蠻有意思的點(diǎn):
沒有直接使用Object的hashcode。神奇數(shù)字0x61c88647可以看看。