Метод onSpinWait
Метод onSpinWait класса Thread является статическим и не принимает параметров.
Он вызывается внутри цикла ожидания, чтобы дать подсказку процессору о том,
что текущий поток выполняет «холостое» вращение (spin), а не полезные вычисления.
Это может повысить производительность и снизить энергопотребление в многопоточных
программах, где поток ожидает изменения состояния без блокировки.
Синтаксис
Thread.onSpinWait()
Пример
Давайте создадим поток, который в цикле ожидает изменения флага,
и используем onSpinWait для оптимизации ожидания:
public class Main
{
private static volatile boolean flag = false;
public static void main(String[] args) throws InterruptedException
{
Thread worker = new Thread(() -> {
while (!flag)
{
Thread.onSpinWait();
}
System.out.println("Flag changed!");
});
worker.start();
Thread.sleep(100);
flag = true;
worker.join();
}
}
Результат выполнения кода:
"Flag changed!"
Пример
Давайте сравним два потока: один использует onSpinWait,
а другой просто выполняет пустой цикл. Оба ждут счётчик:
public class Main
{
private static volatile int counter = 0;
public static void main(String[] args) throws InterruptedException
{
Thread spinner = new Thread(() -> {
while (counter < 1000000)
{
Thread.onSpinWait();
}
System.out.println("Spinner finished");
});
Thread busy = new Thread(() -> {
while (counter < 1000000)
{
// busy wait without hint
}
System.out.println("Busy finished");
});
spinner.start();
busy.start();
for (int i = 0; i < 1000000; i++)
{
counter = i + 1;
}
spinner.join();
busy.join();
System.out.println("Done");
}
}
Результат выполнения кода (порядок вывода может меняться):
"Spinner finished"
"Busy finished"
"Done"
Смотрите также
-
метод
yield,
который уступает процессор другому потоку -
метод
sleep,
который приостанавливает поток на заданное время -
класс
AtomicInteger,
который обеспечивает атомарные операции над целыми числами -
метод
Thread,
который представляет поток выполнения в Java