线程关联是什么意思?

在某个地方,我听说过线程关联和线程关联执行器。但是至少在java中我找不到合适的参考。有人可以向我解释一下这到底是怎么回事吗?


答案 1

有两个问题。首先,线程最好与某个 CPU(内核)具有关联性,以充分利用其 CPU 本地缓存。这必须由操作系统处理。线程的这种 CPU 关联通常也称为“线程关联”。在Java的情况下,没有标准的API来控制它。但是有第三方库,正如其他答案所提到的。

其次,在Java中,有一种观察结果是,在典型的程序中,对象是线程仿射的,即通常大多数时候只由一个线程使用。因此,JVM优化器的任务是确保仿射到一个线程的对象彼此靠近地放置在内存中以适合一个CPU的缓存,但将对象仿射到不同的线程上,而不是彼此太靠近,以避免它们共享一条高速缓存行,否则两个CPU /内核必须过于频繁地同步它们。

理想的情况是,一个 CPU 可以独立地处理某些对象,而另一个 CPU 可以处理放置在不相关内存区域中的其他对象。

考虑 Java 对象的线程相关性的优化的实际示例包括

  • 线程本地分配缓冲区 (TB)

    使用 TLAB,每个对象在专用于创建它的线程的内存区域中开始其生存期。根据代式垃圾回收器背后的主要假设(“大多数对象将英年早逝”),大多数对象将在这样的线程局部缓冲区中度过其整个生命周期。

  • 偏置锁定

    使用偏置锁定,JVM 将执行锁定操作,并假设对象仅由同一线程锁定,仅当此假设不成立时,才切换到更昂贵的锁定实现。

  • @Contended

    为了解决另一端,即已知由多个线程访问的字段,HotSpot/OpenJDK有一个注释,目前不是公共API的一部分,用于标记它们,指示JVM将这些数据从其他可能未共享的数据中移开。


答案 2

让我试着解释一下。随着多核处理器的兴起,线程之间的消息传递和线程池,调度变得更加昂贵。为什么这比以前重得多,为此我们需要理解“机械同情”的概念。有关详细信息,您可以浏览其上的博客。但粗略地说,当线程分布在处理器的不同内核上时,当它们试图交换消息时;缓存未命中概率很高。现在来谈谈您的具体问题,线程关联能够将特定线程分配给特定的处理器/内核。这是可用于它的java之一。