-
ThreadLocal用在什么地方?
-
ThreadLocal一些细节!
-
ThreadLocal的最佳实践!
-
ThreadLocal是用在多线程的场景的, 总结下来就两种用途
1.保存线程上下文信息,在任意需要的地方获取,
2.线程安全,避免某些情况需要考虑线程安全必须同步带来的性能损失
第一种由于threadlocal的特性,同一线程在某些地方进行设置,在随后的任意地方都可以获取到,从而可以用来保存线程上下文信息
常用的比如每个请求怎么把一串后续关联起来,就可以用ThreadLocal进行set,在后续的任意需要记录日志的方法里面进行get获取到请求id,从而把整个请求串起来。
还有比如Spring的事务管理,用ThreadLocal存储Connection,从而各个DAO可以获取同一Connection,可以进行事务回滚,提交等操作。
备注:ThreadLocal的这种用处,很多时候是用在一些优秀的框架里面的,一般我们很少接触,反而下面的场景我们接触的更多一些!
第二种
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。但是ThreadLocal也有局限性,我们来看看阿里规范
threadlocal无法解决共享对象的更新问题,threadlocal对象建议用static修饰,这个变量是针对一个线程内所有操作共享的,所以设置为静态变量,也就是说类在第一次使用是装载,只分配一块存储空间,所有此类的对象(只要是这个线程内定义的)都可以操作这个变量,
每个线程往threadlocal中读取数据都是线程隔离,互相之间不影响,所以threadlocal无法解决共享对象的更新问题
备注:由于不需要共享信息,自然不存在竞争问题了,从而保证了某些情况下线程安全问题,以及避免了某些情况必须要考虑线程安全必须同步带来的性能损失