从ThreadLocal
变量中读取的速度比从常规字段中读取的速度慢多少?
更具体地说,简单对象创建比访问ThreadLocal
变量快还是慢?
我认为它足够快,因此每次创建ThreadLocal<MessageDigest>
实例比创建MessageDigest
实例要快得多。但这是否也适用于字节[10]或字节[1000]?
编辑:问题是当调用ThreadLocal
的get时真正发生了什么?如果这只是一个领域,就像其他领域一样,那么答案将是“它总是最快的”,对吗?
最佳答案
运行未发布的基准测试,ThreadLocal.get
在我的计算机上每次迭代大约需要35个周期。没什么。在Sun的实现中,Thread
中的自定义线性探测哈希图将ThreadLocal
映射为值。因为只有一个线程可以访问它,所以它可能非常快。
小对象的分配需要类似的周期数,尽管由于缓存耗尽,您可能会在紧密循环中得到较低的数字。MessageDigest
的构建可能相对昂贵。它具有相当多的状态,并且通过Provider
SPI机制进行构造。您可能能够通过例如克隆或提供Provider
进行优化。
仅仅因为缓存ThreadLocal
而不是创建缓存可能更快,并不一定意味着系统性能会提高。您将拥有与GC相关的额外开销,这会降低一切速度。
除非您的应用程序非常使用MessageDigest
,否则您可能需要考虑使用常规的线程安全缓存。