很多程序员对ThreadLocal的原理不熟。
ThreadLocal 有个很眩的功能------一个类如果不支持多线程的话, 可以用ThreadLocal来包装它的对象。
从而被包装的对象就有了"多线程的能力".
它是如何实现的?要了解这个原理,首先要明白下列几点
1. ThreadLocal 对象 其实只是一个Key对象,是不变的,它并不保存具体的值
2. ThreadLocal.set(T value) 方法, 并不是把 value保存在ThreadLocal内(这弯很多程序员都没有转过来)
3. 每个线程(Thread) 都维护了一个Map<ThreadLocal,T>的实例。ThreadLocal的set,get 方法其实是对这个 map进行操作
4.ThreadLocal的set,get方法在运行过程中,如何找到哪个线程呢? 很简单:通过Thread.currentThread() 就找到了
5.由于ThreadLocal 对象其实是作为Map的一个Key对象,所以它一次只能携带一个值
总结:ThreadLocal 包装的对象,其实是为每个线程创建一个对象而已,这样的话,一个对象只属于一个线程,也就不会存在多线程的问题。所以"多线程的能力" 其实是个假像,一个"魔法"而已.
思想精髓是: 用空间(每个线程都创建一个对象)来换取时间(同步消耗的时间)