В настоящее время я разрабатываю приложение, которое в некоторых тестовых случаях продолжается бесконечным циклом, но если я повторю те же тесты, все идет хорошо. Чтобы предотвратить это, я использую дополнительный поток для отслеживания времени, прошедшего с момента запуска задачи, но в настоящее время я не использую синхронизированные блоки, потому что я не знаю, как это сделать.Использование синхронизированного блока для защиты от бесконечных циклов
Вот пример:
public class ThreadHarvest {
private static final ReentrantLock lock = new ReentrantLock();
private static boolean safe;
public static void main(String[] args) throws InterruptedException
{
Thread task = new Thread(() ->{
lock.lock();
safe = false;
for (long i = 10000000L; i > 0L; --i)
System.out.println(i);
safe = true;
lock.unlock();
System.out.println("Safe ended!");
});
task.start();
while (lock.isLocked() == false);
lock.tryLock(5, TimeUnit.SECONDS);
if (!safe)
{
task.stop();
System.out.println("Force ended!");
}
}
}
Кроме того, существует определенная область, которая гарантированно безопасна, что только после того, как блокировка снимается. И я тоже знаю, что метод остановки устарел, поэтому, если у вас есть хорошие идеи, чтобы сделать его менее склонным к ошибкам, я был бы очень благодарен: D
Примечание: поскольку 'boolean safe' не является изменчивым, ваш основной поток может не увидеть это изменение. –
Синхронизация не является защитой от бесконечных циклов, но это возможный способ преобразования их в блокировки. Ваш вопрос не имеет смысла. – EJP
@PeterLawrey iirc, 'ReentrantLock' также следить за тем, чтобы изменения были видимыми. (вы можете использовать Google для «java reentrantlock memory барьер»). Способ OP, использующий его *, кажется, работает нормально (требуется больше проверки: P) –