ThreadLocal的使用就是,你在一个类中定义了这么类型的一个变量,不同的线程环境中get,set使用这个变量,会在各自的线程环境中保存各自的值。可以通过重写initialValue()为这个变量赋予初始值,默认为null。
ThreadLocal是如何各个线程都有自己对应于这个变量的值的呢?如果是你,你会怎么去实现呢?
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的泄漏。如果还用了匿名内部类的方式使用了ThreadLocal那将导致更多对象的泄漏!
最后,ThreadLocal还有一个蛮有意思的点:
没有直接使用Object的hashcode。神奇数字0x61c88647可以看看。
网友评论