ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
注意:由于使用ThreadLocal有可能会造成内存泄漏(所谓内存泄漏,对象A持有B的强引用,但是B的key已经为null且被GC回收掉,这个时候B的value不为空,但是又不能被用到,从而造成内存浪费,就叫内存泄漏),所以建议每次在使用之后用
try…finally中调用remove()方法进行回收。