java - 什么是多线程环境中的忙自旋?

标签 java multithreading

什么是多线程环境中的“忙转”?

它有什么用,如何在多线程环境下用java实现?

它对提高应用程序的性能有何帮助?

最佳答案

其他一些答案忽略了忙等待的真正问题。

除非您谈论的是一个您关心节约电力功率的应用程序,否则消耗 CPU 时间本身并不是一件坏事。只有当有一些其他线程或进程准备好运行时,这才是糟糕的。当准备运行的线程之一是您的忙等待循环正在等待的线程时,这真的很糟糕。

这才是真正的问题。在正常操作系统上运行的正常用户模式程序无法控制哪些线程在哪些处理器上运行,正常操作系统无法区分忙于等待的线程和正在工作的线程,即使操作系统知道线程正在等待,它也无法知道线程在等待什么。

因此,忙碌的服务员完全有可能等待数毫秒(实际上是永恒),等待事件,而唯一可以使事件发生的线程位于边线(即,在运行队列中) ) 等待轮到它使用 CPU。

忙等待通常用于严格控制哪些线程在哪些处理器上运行的系统中。当您知道导致事件的线程实际上在不同的处理器上运行时,忙等待可能是等待事件的最有效方式。当您为操作系统本身编写代码或编写在实时操作系统下运行的嵌入式实时应用程序时,通常会出现这种情况。


Kevin Walters 写了关于等待时间非常短的案例。在普通操作系统上运行的受 CPU 限制的普通程序可能被允许在每个时间片中执行数百万条指令。因此,如果程序使用自旋锁来保护仅包含几条指令的临界区,那么任何线程都不太可能在临界区中丢失其时间片。这意味着,如果线程 A 发现自旋锁被锁定,那么持有锁的线程 B 很可能实际上 在不同的 CPU 上运行。这就是为什么当您知道它将在多处理器主机上运行时,在普通程序中使用自旋锁是可以的。

关于java - 什么是多线程环境中的忙自旋?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25067059/

相关文章:

multithreading - 如何在一个类中创建线程?

java - 映射数组或流中元素出现的次数

java - 如何反转4位数字(java)

c++ - 多线程:thread 或 process.h - C++

循环字符数组缓冲区 - c

wpf - 我应该在后台线程中运行所有内容吗?

java - run方法如何访问不同Thread的变量?

java - Android Push Notification 从设备到其他设备

java - 使用字符串文字创建字符串常量池的编译器行为

Java 将字符串值匹配到枚举,每个枚举值都有多个字符串匹配可能性