ThreadLocal的使用就是,你在一個類中定義了這么類型的一個變量,不同的線程環(huán)境中g(shù)et,set使用這個變量,會在各自的線程環(huán)境中保存各自的值。可以通過重寫initialValue()為這個變量賦予初始值,默認為null。
ThreadLocal是如何各個線程都有自己對應于這個變量的值的呢?如果是你,你會怎么去實現(xiàn)呢?
java的設計是:ThreadLocalMap去真正的保存和存儲值,每個線程都有自己的ThreadLocalMap。通過ThreadLocal的實例作為key去映射到對應的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的源碼,因為這里有一個指的思考的地方:為什么對key(ThreadLocal)使用弱引用?因為ThreadLocalMap都是線程持有的,強引用會導致ThreadLocal的泄漏。如果還用了匿名內(nèi)部類的方式使用了ThreadLocal那將導致更多對象的泄漏!
最后,ThreadLocal還有一個蠻有意思的點:
沒有直接使用Object的hashcode。神奇數(shù)字0x61c88647可以看看。