Я никогда не использовал volatile очень часто. Можно ли использовать его для пропуска выполнения метода, если его выполняет другой поток? Я думаю, что в приведенном ниже коде все еще возможно, что несколько потоков пройдут проверку и выполнят метод. Не так ли?
private static boolean volatile test = false;
...
public void test() {
if (test) {
return;
}
test = true;
try {
System.out.println("test() started in Thread with ID " + Thread.currentThread().getId());
Thread.sleep(10000);
System.out.println("test() finished in Thread with ID " + Thread.currentThread().getId());
} catch (InterruptedException e) {
e.printStackTrace();
}
test = false;
}
Пример использования: метод может запускаться периодически, но в то же время он может запускаться пользователем вручную. Нет причин запускать его дважды один за другим, используя ключевое слово synchronized. Подскажите, пожалуйста, с volatile. В противном случае я не вижу причин для понимания этого, кроме собеседований :) Другие решения, не основанные на volatile, приветствуются.