java - Thread 类的 onSpinWait​() 方法 - Java 9

标签 java multithreading concurrency java-threads spinlock

在学习 Java 9 特性时,我发现了一个新的 Thread 类方法,称为 onSpinWait​ .根据 javadocs,此方法用于:

Indicates that the caller is momentarily unable to progress, until the occurrence of one or more actions on the part of other activities.

谁能帮我理解这个方法,给出一个真实的例子或场景?

最佳答案

它与 x86 操作码 PAUSE 相同(并且可能编译为),等效于 Win32 宏 YieldProcessor、GCC 的 __mm_pause() 和C# 方法 Thread.SpinWait

这是一种非常弱化的屈服形式:它告诉您的 CPU 您处于一个循环中,该循环可能会消耗许多 CPU 周期以等待某事发生(忙于等待)。

这样,CPU 可以将更多资源分配给其他线程,而无需实际加载 OS 调度程序并将准备运行的线程出列(这可能很昂贵)。

自旋锁的一个常见用途是,当您知道共享内存上的争用非常罕见或很快结束时,自旋锁可能比普通锁执行得更好。

此类的伪代码如下所示:

int state = 0; //1 - locked, 0 - unlocked

routine lock:
    while state.cas(new_value=1, wanted_value=0) == false //if state is 0 (unlocked), store 1 (locked) and return true, otherwise just return false.
       yield

routine unlock:
    atomic_store(state,0)

yield可以用Thread.onSpinWait()实现,暗示在尝试加锁的同时,CPU可以给其他线程更多的资源。

这种让步技术在实现无锁算法时非常普遍和流行,因为它们中的大多数都依赖于忙等待(几乎总是作为原子比较和交换循环实现)。这具有您可以想象的所有实际用途。

关于java - Thread 类的 onSpinWait​() 方法 - Java 9,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44622384/

相关文章:

java - 如何检测 32 位 int 上的整数溢出?

c++ - 如何在 std::bind 中使用模板函数参数?

java - 线程是否创建静态变量的多个实例

java - 在 Android 中加密和解密文件的任何优化方式

java - 如何排除 Ant 测试?

python - 如何在不同的 Python 多处理核心之间共享带有元组键的全局字典?

java - 一个简单的多线程闹钟

concurrency - Go lang关闭管道死锁

python - 在 Python 中进行多线程/并发编程有哪些选择?

java - 是否有可用的 Java LZO 与 Deflate 与 Gzip 的基准测试?