当前位置: 首页 > 面试题库 >

ThreadLocal变量的性能

莫宁
2023-03-14
问题内容

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

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

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

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


问题答案:

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

小对象的分配需要类似的周期数,尽管由于缓存耗尽,您可能会在紧密循环中得到较低的数字。

的建造MessageDigest可能相对昂贵。它具有相当数量的状态,并且通过ProviderSPI机制进行构造。您可以通过克隆或提供来进行优化Provider

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

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



 类似资料:
  • 问题内容: 我在这里阅读Threadlocal的JavaDoc https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ThreadLocal.html 它说:“ ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段(例如,用户ID或事务ID)。” 但是我的问题是,为什么他们选择使其静态化(通常)-使其具有“每个线程”状态

  • 变量可以很简单地定义成可变(var)和不可变(val)的变量。这个与Java中使用的final很相似。但是不可变在Kotlin(和其它很多现代语言)中是一个很重要的概念。 一个不可变对象意味着它在实例化之后就不能再去改变它的状态了。如果你需要一个这个对象修改之后的版本,那就会再创建一个新的对象。这个让编程更加具有健壮性和预估性。在Java中,大部分的对象是可变的,那就意味着任何可以访问它这个对象的

  • ThreadLocal类用于创建线程局部变量,这些变量只能由同一线程读取和写入。 例如,如果两个线程正在访问引用相同threadLocal变量的代码,则每个线程都不会看到由其他线程完成的对threadLocal变量的任何修改。 ThreadLocal方法 以下是ThreadLocal类中可用的重要方法列表。 Sr.No. 方法和描述 1 public T get() 返回当前线程的此线程局部变量副

  • 问题内容: 我还是Python的新手,我一直在尝试提高Python脚本的性能,因此我在有或没有全局变量的情况下对其进行了测试。我给它计时,令我惊讶的是,它在声明了全局变量的情况下运行得更快,而不是将局部变量传递给函数。这是怎么回事?我以为局部变量的执行速度更快?(我知道全球人并不安全,我仍然很好奇。) 问题答案: 当地人应该更快 根据此页面上的本地人和全球人: 当一行代码要求输入变量x的值时,Py

  • 由于对公共EJB方法的Async调用,我有一个继承线程本地变量,我想将其传递给由EJB容器的线程池分配的另一个子线程。发起异步调用的父调用方是REST资源,它是无状态EJB。仅当子线程创建为新线程时,才将值传递给其子线程。一旦在池中创建了线程,它就不会破坏线程,直到服务器被反弹。 考虑到上述事实,我的案例的子线程来自EJB容器维护的线程池。仅当服务器启动后第一次调用资源时,或者如果刚刚在Threa

  • 问题内容: 编写之间是否存在性能差异(如果有) 与 另外,如果我们在参数签名中进行结构分解,会获得或失去任何性能?参见example3 我认为在这种情况下example3是编写函数的最佳方法? 功能性反应组件示例: 问题答案: 由于您的代码将被编译/缩小,因此不会有任何性能问题。 注意,使用React,您的代码将被转译,其作用与 在babel编译器在线测试仪上检查结果