ThreadLocal变量中读取的速度比从常规字段中读取的速度慢多少?

更具体地说,简单对象创建比访问ThreadLocal变量快还是慢?

我认为它足够快,因此每次创建ThreadLocal<MessageDigest>实例比创建MessageDigest实例要快得多。但这是否也适用于字节[10]或字节[1000]?

编辑:问题是当调用ThreadLocal的get时真正发生了什么?如果这只是一个领域,就像其他领域一样,那么答案将是“它总是最快的”,对吗?

最佳答案

运行未发布的基准测试,ThreadLocal.get在我的计算机上每次迭代大约需要35个周期。没什么。在Sun的实现中,Thread中的自定义线性探测哈希图将ThreadLocal映射为值。因为只有一个线程可以访问它,所以它可能非常快。

小对象的分配需要类似的周期数,尽管由于缓存耗尽,您可能会在紧密循环中得到较低的数字。
MessageDigest的构建可能相对昂贵。它具有相当多的状态,并且通过Provider SPI机制进行构造。您可能能够通过例如克隆或提供Provider进行优化。

仅仅因为缓存ThreadLocal而不是创建缓存可能更快,并不一定意味着系统性能会提高。您将拥有与GC相关的额外开销,这会降低一切速度。

除非您的应用程序非常使用MessageDigest,否则您可能需要考虑使用常规的线程安全缓存。

09-11 03:36
查看更多