ThreadLocal 是什么?它的实现原理呢?

发布时间:2024年01月05日
一个工作了 4 年的小伙伴,又私信了我一个并发编程里面的问题。
他说他要抓狂了,每天 CRUD,也没用到过 ThreadLocal 啊,怎么就不能问我怎么写CRUD 呢?
我反问他如果只问你项目和业务,那有些 4 年的小伙伴他要求月薪 30K,有些只要求月薪 15K,
那请问,凭什么每个月要多出 15k 给你?我花 30k 招两个 15k 的,不能写 CRUD 吗?
好吧,我们来看看 ThreadLocal 是什么?它的实现原理呢?

一、问题解析

这个问题我从三个方面来回答。
1. ThreadLocal 是一种线程隔离机制,它提供了多线程环境下对于共享变量访问的安全性。
2. 在多线程访问共享变量的场景中(出现下面第一个图),一般的解决办法是对共享变量加锁(出
现下面第二个图),从而保证在同一时刻只有一个线程能够对共享变量进行更新,并且基于Happens-Before 规则里面的监视器锁规则,又保证了数据修改后对其他线程的可见性。
3. 但是加锁会带来性能的下降,所以 ThreadLocal 用了一种空间换时间的设计思想,也就是说在每个线程里面,都有一个容器来存储共享变量的副本,然后每个线程只对自己的变量副本来做更新操作,这样既解决了线程安全问题,又避免了多线程竞争加锁的开销。
4. ThreadLocal 的具体实现原理是,在 Thread 类里面有一个成员变量ThreadLocalMap,它专门来存储当前线程的共享变量副本,后续这个线程对于共享变量的操作,都是从这ThreadLocalMap 里面进行变更,不会影响全局共享变量的值。
以上就是我对这个问题的理解。

二、问题总结

ThreadLocal 使用场景比较多,比如在数据库连接的隔离、对于客户端请求会话的隔离 等等。
在 ThreadLocal 中,除了空间换时间的设计思想以外,还有一些比较好的设计思想,比如线性探索解决 hash 冲突,数据预清理机制、弱引用 key 设计尽可能避免内存泄漏等。这些思想在解决某些类似的业务问题时,都是可以直接借鉴的。
好的,本期高手面试系列的文章就到这里结束了,喜欢的朋友记得点赞和收藏。
我是 浮生,一个工作了 14 年的 Java 程序员,咱们下期再见。

三、粉丝福利

最近很多同学问我有没有java学习资料,我根据我从小白到架构师多年的学习经验整理出来了一份50W字面试解析文档、简历模板、学习路线图、java必看学习书籍?、 需要的小伙伴 可以关注我
公众号:“?
灰灰聊架构?”, 回复暗号:“?321?”即可获取

文章来源:https://blog.csdn.net/sinat_53467514/article/details/135412773
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。