Closed xxd137494375 closed 1 year ago
对于这里有个疑问,加了锁,已经保证了线程安全,为何还要使用
copy on write
?
@xxd137494375 好问题 👍 其实在小伙伴写的文章或其评论中,我也多次看到提这个问题~
threadLocalHolder
有 读写2类操作:
threadLocalTransmittee#replay
、threadLocalTransmittee#clear
(调用会多)registerThreadLocal
、unregisterThreadLocal
(注册的调用极少)threadLocalHolder
是WeakHashMap
,不是线程安全的集合/并发集合threadLocalHolderUpdateLock
也体现表达了这一点COW
(Copy On Write
)是因为
threadLocalHolder
的volatile
来安全发布 引用volatile
并不保证引用内容后续修改的同步(如可见性、原子性)COW
内容、再更新volatile
引用,来保证安全发布引用的新对象内容
(这里是WeakHashMap
集合对象)PS:
COW
+ volatile
」这样的实现方式?为了读操作时的无锁高性能,读threadLocalHolder
是个高频操作。
📔 上面是个人的一些简单说明;并发问题要解释清楚,可能要带出很多内容。
单例模式的Double Check
实现方式(与这个Issue的问题涉及基本相同的关注点/注意点),
已经有很多资料文章讨论,可以找找看看。💕
系统理解则力荐研读《Java并发编程实战》;上面的问题及其要关注的方面 是这本书的基本部分。PS:更多并发的系统书籍可以看看个人整理的并发书单。
对于并发问题,不同解释方式对于不同的人会有用或更容易理解。 💕
在看
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