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

Thread类的onSpinWait()方法-Java 9

孔甫
2023-03-14
问题内容

在学习Java
9功能时,我遇到了一种Thread叫做的新方法onSpinWait​。根据javadocs,此方法用于此目的:

指示呼叫者暂时无法继续进行,直到其他活动发生一项或多项动作为止。

有人可以帮助我理解这种方法,提供真实的例子或场景吗?


问题答案:

它与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可以将更多资源分配给其他线程。

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



 类似资料:
  • 本文向大家介绍c# Thread类的用法详解,包括了c# Thread类的用法详解的使用技巧和注意事项,需要的朋友参考一下   Thread类相对于线程池中的线程,使用者有更多的控制权。该类允许创建前台线程,设置线程优先级等。Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数。 1、给线程传递数据   给线程传递数据的两种方式:

  • 本文向大家介绍Java Thread类的最终boolean isDaemon()方法(带示例),包括了Java Thread类的最终boolean isDaemon()方法(带示例)的使用技巧和注意事项,需要的朋友参考一下 线程类最终布尔 软件包java.lang.Thread.isDaemon()中提供了此方法。 此方法用于检查当前线程是否是守护程序线程。 守护程序线程是在后台运行的线程。 此方

  • 本文向大家介绍Thread 类中的start() 和 run() 方法有什么区别?相关面试题,主要包含被问及Thread 类中的start() 和 run() 方法有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 start()方法可以用来启动线程,调用该方法,会创建一个新的线程,然后内部执行run()方法;不能多次调用,否则会抛异常 直接调用run()方法,不会创建新的线程;可以进行多次调

  • final是java中的访问修饰符还是非访问修饰符? Thread类公共最终无效setName(字符串名称)的setName()方法真的是最终的吗?如果是,是否意味着一旦线程名称更改,以后就不能更改,因为最终关键字...? 或者final不是方法setName()的一部分? 请给我正确的答案。。

  • 本文向大家介绍Java之Thread的join方法实例,包括了Java之Thread的join方法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java之Thread的join方法。分享给大家供大家参考。具体实现方法如下: join public final void join() throws InterruptedException等待该线程终止。 抛出: Interrupted

  • 本文向大家介绍Java Thread线程类final void checkAccess方法(带示例),包括了Java Thread线程类final void checkAccess方法(带示例)的使用技巧和注意事项,需要的朋友参考一下 线程类final void checkAccess() 包java.lang.Thread.checkAccess()中提供了此方法。 此方法用于检查当前正在执行的