原理分析:ThreadLocal提供了get与set等访问接口或方法,这些方法为每个使用该变量的线程创建一个副本,即每个线程内部都会有一个该变量,且在线程内部任何地方都可以使用,线程之间互不影响,这样一来就不存在线程安全问题,也不会严重影响程序执行性能。
1)实际的通过ThreadLocal创建的副本是存储在每个线程自己的threadLocals中的;
2)为何threadLocals的类型ThreadLocalMap的键值为ThreadLocal对象,因为每个线程中可有多个threadLocal变量,就像上面代码中的longLocal和stringLocal;
3)在进行get之前,必须先set,否则会报空指针异常;
如果想在get之前不需要调用set就能正常访问的话,必须重写initialValue()方法。
用来解决数据库连接、Session管理
使用场景:高并发,以空间换取时间,可以减少锁竞争。
ThreadLocal类可以更规范的维持线程的封闭性,这个类使线程中的某个值与保存的对象关联起来。
1. 何时使用ThreadLocal类及注意事项
当某个频繁执行的操作需要一个临时对象,例如一个缓冲区,而同时又希望避免在每次执行时都重新分配该临时对象。ThreadLocal变量类似于全局变量,它能降低代码的可重用性。
网友评论