技术分享

ThreadLocal实现原理和最佳实践

2019-12-05  本文已影响0人  十毛tenmao

ThreadLocal在多线程项目中使用很多,简化了多线程对资源的使用,

ThreadLocal常用场景

适用于每个线程需要有自己单独的实例,实例需要在多个方法中共享,但不希望被多线程共享

ThreadLocal实现原理

`ThreadLocal`内存布局

图中实线是引用,虚线是弱引用(不会阻止内存的回收)

ThreadLocal为什么会内存泄漏

从表面上看内存泄漏的根源在于使用了弱引用。网上的文章大多着重分析ThreadLocal使用了弱引用会导致内存泄漏,但是另一个问题也同样值得思考:为什么使用弱引用而不是强引用?

我们先来看看官方文档的说法:

To help deal with very large and long-lived usages, the hash table entries use WeakReferences for keys.
为了应对非常大和长时间的用途,哈希表使用弱引用的 key。

下面我们分两种情况讨论:

因此,ThreadLocal内存泄漏的根源是:由于ThreadLocalMap的生命周期跟Thread一样长,如果没有手动删除对应key就会导致内存泄漏,而不是因为弱引用。
因此,ThreadLocal内存泄漏的根源是:由于ThreadLocalMap的生命周期跟Thread一样长,如果没有手动删除对应key就会导致内存泄漏,而不是因为弱引用。

自问自答

最佳实践

参考

上一篇 下一篇

猜你喜欢

热点阅读