章
目
录
ThreadLocal是多线程编程的一个重要工具,在分布式面试中,也经常会被问到关于threadlocal使用的问题。
一、ThreadLocal是啥,为啥要用它?
简单来说,ThreadLocal就像是每个线程的专属“小仓库”。在多线程场景下,我们经常会遇到一些问题,比如想在线程的各个地方都能方便地获取到某些特定信息,像当前访问用户的信息,这个时候ThreadLocal就派上用场了。只要线程还在运行,它“仓库”里存的值,在整个线程生命周期内的任何地方都能拿到,而且这个值只属于当前线程,别的线程动不了,这就保证了线程间数据的独立性。
二、ThreadLocal在实际开发中的常见应用场景
(一)存储当前登录用户信息
在开发中,存储当前登录用户的信息是ThreadLocal使用最多的场景之一。打个比方,当一个线程解析出用户的TOKEN,并且获取到用户的基本信息后,就可以把这些信息一股脑儿地“丢”到ThreadLocal这个“小仓库”里。之后,在线程后续访问的各个方法里,在整个调用链路中,都能轻松地从ThreadLocal里把用户信息取出来。这可比在方法之间来回传递参数方便多了,不用你传我、我传他的,省了不少事儿。
有的小伙伴可能会问:“为啥不用Redis来存用户信息呢,用的时候直接取不就行了?”Redis确实能保证在各个地方都能取到用户信息,但是它有个小“麻烦”。用Redis存数据得有个key吧,那这个key从哪来呢?存到哪儿呢?绕来绕去,还是得靠线程上下文,得靠ThreadLocal来解决这个问题。
(二)管理数据库连接
在数据库连接池的场景里,ThreadLocal也发挥着大作用。数据库连接池里有好多数据库连接,要是一个线程能同时占用好多连接,那连接池很快就被占满了;而且不同线程还可能会抢连接,这可就乱套了。
怎么解决呢?最好的办法就是让每个线程都有自己固定的数据库连接。这时候ThreadLocal就闪亮登场啦!把数据库连接存到ThreadLocal里,之后线程每次要进行数据库操作时,直接从ThreadLocal里拿之前存好的连接就行,这样就避免了连接争抢,也提高了数据库操作的效率。
(三)关联日志查询
ThreadLocal还能用来查询关联日志。想象一下,我们在开发中需要跟踪整个链路的日志信息,这时候就可以用ThreadLocal存储线程的全局值。当线程访问到不同地方时,都把这个全局值关联上。这样在进行链路跟踪、查询日志的时候,直接通过这个全局值,就能查到整个链路的日志信息,是不是超级方便?
三、总结
ThreadLocal内容就这么多,要是对今天讲的内容有啥疑问,欢迎在评论区留言,大家一起讨论讨论!