工作中对InheritableThreadLocal使用的思考
💡
原文中文,约5200字,阅读约需13分钟。
📝
内容提要
使用InheritableThreadLocal时,线程池中的子线程无法获取父线程的最新变量。实验表明,子线程在创建时继承父线程变量,但在线程复用后无法更新。建议使用TransmittableThreadLocal以确保线程变量的正确传递。
🎯
关键要点
- 使用InheritableThreadLocal时,线程池中的子线程无法获取父线程的最新变量。
- InheritableThreadLocal只能在父线程创建子线程时获取父线程的线程变量,线程复用后无法更新。
- 实验表明,线程复用时子线程仍然保留之前的父线程变量,导致获取线程变量错误。
- 建议使用TransmittableThreadLocal以确保线程变量的正确传递。
- TransmittableThreadLocal可以解决线程封闭问题,确保子线程获取到最新的父线程变量。
❓
延伸问答
InheritableThreadLocal的主要问题是什么?
InheritableThreadLocal在使用线程池时,子线程无法获取父线程的最新变量,导致获取线程变量错误。
如何验证InheritableThreadLocal在线程池中的问题?
通过创建一个固定大小的线程池,先设置父线程变量,然后在子线程中打印该变量,最后更改父线程变量并再次打印,可以发现子线程仍然获取到旧的变量值。
为什么InheritableThreadLocal在子线程复用时无法更新变量?
因为InheritableThreadLocal只在子线程创建时初始化父线程的变量,在线程复用时不会更新子线程中的变量值。
有什么替代方案可以解决InheritableThreadLocal的问题?
可以使用TransmittableThreadLocal,它能够确保子线程获取到最新的父线程变量,解决线程封闭问题。
TransmittableThreadLocal是如何工作的?
TransmittableThreadLocal通过在提交任务时调用TtlRunnable的get方法,确保线程变量能够正确传递到子线程。
InheritableThreadLocal和TransmittableThreadLocal有什么区别?
InheritableThreadLocal在子线程创建时继承父线程变量,但在线程复用时无法更新;而TransmittableThreadLocal可以在任何时候传递最新的父线程变量给子线程。
➡️