volatile
просто гарантирует, что изменения в переменной доступны для всех потоков.
Фон: поток может создавать локальные копии общих переменных.Синхронизация значений этих локальных переменных с глобальными общими переменными - это то, что volatile
влияет.
Однако это не синхронизирует в явном виде одной записи, монитора / критической области.
Весь набор инструментов java.util.concurrent
предлагает такие вещи, как обеспечение того, что только один поток может изменить значение и тому подобное.Если вы хотите начать с нуля, можно с помощью двух переменных сделать некоторые блокирующие действия: поиск алгоритмов Дейкстры .
Здесь я думаю AtomicBoolean
может подойти для неблокирующего использования.
Если вы хотите достичь глобального логического состояния, которое приостанавливает соотв. возобновляет потоков при переключении (ваш stopped
) вместо некрасивого занятого ожидания :
public void run () {
while (true) {
doWork();
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException ex) {
return;
}
}
}
Использование глобального CyclicBarrier
- не самый хороший API, поскольку он работает с N предопределенных Runnable
s.