26|ThreadLocal(上):线程安全的另类实现思路
康杨
你好,我是康杨。
今天我们来聊聊线程安全的另一种经典实现:ThreadLocal。在正式学习之前,我想先给你讲个故事,希望这个故事能帮你体会到 ThreadLocal 背后的设计思想。
这个故事其实体现了 ThreadLocal 的设计原理。我们都知道,在多线程编程中,如果多个线程共享同一个变量,而没有应用类似乐观锁、悲观锁的同步机制时,很容易出现线程安全问题。
就像图中 a 的值,最终到底是 1 还是 2 完全是不可预知的,在没有同步机制的情况下,它既可能是 1 也可能是 2。而 ThreadLocal 绕过了线程间如何竞争一个变量的惯常思路,通过为每个线程提供一个线程独享的变量副本的方式,以用空间换时间的思想从另一个角度解决了线程安全问题。而这也是我们日常解决问题时可以借鉴的一种思想,当用通常的方式似乎无解的时候,也许换个视角,思路就完全打开了,借用古人的一句诗就是“行到水穷处,坐看云起时”。
在这个故事中,每个人独立的晾衣空间就相当于 ThreadLocal,晾衣空间中的衣服就相当于线程中的变量。每个人只能用自己的晾衣空间,也只能晾晒自己的衣服,从而避免了衣服被拿错的情况。当然,任何事情都是一体两面,为了解决线程安全的问题我们引入了 ThreadLocal,但是对于 ThreadLocal 的误用又会带来其他风险,比如内存泄漏。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
ThreadLocal是一种解决线程安全问题的实现思路,通过为每个线程提供独立的变量副本来避免变量共享。本文通过生动的比喻和详细的技术解释,使读者能够快速了解ThreadLocal的原理、内存布局以及使用方法。文章首先通过一个故事向读者解释了ThreadLocal的设计原理,比喻每个人独立的晾衣空间就相当于ThreadLocal,晾衣空间中的衣服就相当于线程中的变量。接着,文章详细介绍了ThreadLocal的内存布局,解释了ThreadLocal、Thread、ThreadLocalMap及Entry之间的关系。此外,文章还对ThreadLocal与其他线程安全方案进行了对比,指出ThreadLocal采用以空间换时间的思想,通过为每个线程分配一个独享的变量的方式,从根本上绕开了线程安全的问题。文章还深入到ThreadLocal源码中去看看其中的原理,解读了set方法和在ThreadLocalMap中快速定位ThreadLocal对象的方法。最后,文章重点回顾了ThreadLocal的一些要点,帮助读者查漏补缺。整体而言,本文通过生动的比喻和详细的技术解释,使读者能够快速了解ThreadLocal的原理、内存布局以及使用方法。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云时代的 JVM 原理与实战》,新⼈⾸单¥59
《云时代的 JVM 原理与实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(2)
- 最新
- 精选
- 八宝遇到复杂问题时,通过多视角拆解,将复杂问题简单化的方式。点赞! 想到了数学中的3视图,一个角度看不到全貌,多个角度分析问题,层能更全面2023-12-27归属地:河南
- peterThreadLocal虽然是多个线程之间各自有一个备份,但ThreadLocal的出现还是因为有共享变量,那多个线程之间最终还是需要同步这个共享变量吗?2023-10-28归属地:北京
收起评论