java - 线程亲和性是什么意思?

标签 java multithreading concurrency terminology

我在某处听说过 Thread Affinity 和 Thread Affinity Executor。但至少在java中我找不到合适的引用。谁能给我解释一下这是怎么回事?

最佳答案

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

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

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

考虑Java对象的线程亲和性的优化的实际例子是

  • Thread-Local Allocation Buffers (TLABs)

    使用 TLAB,每个对象的生命周期都在专用于创建它的线程的内存区域中开始。根据分代垃圾收集器背后的主要假设(“所有对象中的大多数将在年轻时死去”),大多数对象将在这样的线程本地缓冲区中度过其整个生命周期。

  • Biased Locking

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

  • @Contended

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

关于java - 线程亲和性是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19587323/

相关文章:

java - 获取包含垃圾数据的字符串的特定部分

java - 如何在 Spring MVC 中的 url 中进行包含项目名称的重定向?

c++ - 终止 C++ 中的线程及其产生的任何进程

Java缓存线程池和线程本地

javascript - 限制在 Node.js 中的循环中产生的并发子进程数

java - 如何使用 TYPE_BYTE_GRAY 使用 AWT 高效创建灰度缓冲图像

java - 获取三角形中任意点的位置

c# - foreach 的奇怪 lock() 行为

multithreading - 哪些 perl 内置函数是原子的?

Java map : multithreading juggler