alibaba / transmittable-thread-local

📌 a missing Java std lib(simple & 0-dependency) for framework/middleware, provide an enhanced InheritableThreadLocal that transmits values between threads even using thread pooling components.
https://github.com/alibaba/transmittable-thread-local
Apache License 2.0
7.59k stars 1.69k forks source link

关于registerThreadLocal方法加锁和copy on write疑问 #528

Closed xxd137494375 closed 1 year ago

xxd137494375 commented 1 year ago

在看2.14.2版本的源码中,发现registerThreadLocal函数在处理threadLocalHolder并发修改问题时,即加了锁,又使用了copy on write

对于这里有个疑问,加了锁,已经保证了线程安全,为何还要使用copy on write

是在考虑什么隐藏问题吗?

https://github.com/alibaba/transmittable-thread-local/blob/d91853ea3d3501e913f7ac9b35053cc514a86aee/src/main/java/com/alibaba/ttl/TransmittableThreadLocal.java#L1013-L1027

oldratlee commented 1 year ago

对于这里有个疑问,加了锁,已经保证了线程安全,为何还要使用copy on write

@xxd137494375 好问题 👍 其实在小伙伴写的文章或其评论中,我也多次看到提这个问题~

🤖 个人的回答

简单说明

PS:

为什么用「更新锁 + COW + volatile」这样的实现方式?

为了读操作时的无锁高性能,读threadLocalHolder是个高频操作。

📔 上面是个人的一些简单说明;并发问题要解释清楚,可能要带出很多内容。

更多相关的可以看看

单例模式的Double Check实现方式(与这个Issue的问题涉及基本相同的关注点/注意点), 已经有很多资料文章讨论,可以找找看看。💕

系统理解则力荐研读《Java并发编程实战》;上面的问题及其要关注的方面 是这本书的基本部分。PS:更多并发的系统书籍可以看看个人整理的并发书单

💗 欢迎大家继续交流讨论

对于并发问题,不同解释方式对于不同的人会有用或更容易理解。 💕