从 ThreadLocal
中读取了多少变量比常规字段慢?
更具体地说,简单的对象创建比访问 ThreadLocal
更快或更慢。变量?
我认为它足够快,因此拥有 ThreadLocal<MessageDigest>
实例比创建 MessageDigest
的实例快得多每次。但这也适用于 byte[10] 或 byte[1000] 吗?
编辑:问题是调用 ThreadLocal
时到底发生了什么?得到?如果这只是一个领域,就像任何其他领域一样,那么答案将是“它总是最快的”,对吧?
最佳答案
2009 年,一些 JVM 使用 Thread.currentThread()
对象中的非同步 HashMap
实现了 ThreadLocal
。这使它变得非常快(当然,虽然不如使用常规字段访问快),并确保 ThreadLocal
对象在 Thread
死了。在 2016 年更新了这个答案,似乎大多数(全部?)较新的 JVM 使用带有线性探测的 ThreadLocalMap
。我不确定它们的性能——但我无法想象它比早期的实现要差得多。
当然,现在new Object()
也很快,垃圾回收器也很擅长回收短命的对象。
除非你确定创建对象会很昂贵,或者你需要在一个线程一个线程的基础上保持一些状态,否则你最好选择更简单的按需分配解决方案,并且只切换到 ThreadLocal
当分析器告诉你需要时实现。
关于java - ThreadLocal 变量的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/609826/