java - ThreadLocal 变量的性能

标签 java multithreading performance thread-local

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/

相关文章:

android - 在制作应用程序的最终版本时,Android Studio 如何处理 System.out.print 函数?

java - 尝试查找 WebElement 时出现 NullpointerException

java - Couchbase Java SDK 存储桶连接管理

java - 如何通过liferay中的portlet conf选项卡修改属性文件?

c++ - InterlockedExchangePointer 是否有裸露的 c++ 11(或 boost)替代品?

C# BackgroundWorker 和 ProgressBar 问题

c++ - Linux pthreads 上的 gcc 4.7 - 使用 __thread 的重要 thread_local 解决方法(无提升)

ruby-on-rails - 在 Rails 中发送多封电子邮件的最佳方式是什么?

Flutter setState 函数

用于选择线条样式的 JavaFX 组合框