В приложении, над которым я работаю, я нашел следующий фрагмент кода:
public class MyClass {
private AtomicBoolean atomicBoolean = new AtomicBoolean(false);
public void Execute() {
// Whole lot of business logic
// ....
synchronized (this.atomicBoolean) {
// Want to make sure that execution is stopped if Stop() was called
if (this.atomicBoolean.get()) {
throw new SpecificException("...");
}
// Some more business logic...
}
}
public void Stop() {
synchronized (this.atomicBoolean) {
this.atomicBoolean.set(true);
}
}
}
В соответствии с FindBugs это неверно, так как я не могу использовать AtomicBoolean
вместе с synchronized
иожидайте, что это заблокирует объект.
Мой вопрос: как правильно переписать этот метод?Я читал об использовании объекта блокировки вместе с логическим атрибутом вместо этого, но кажется немного неуклюжим ввести два новых атрибута для этой блокировки.
Редактировать: Как указано в комментарии ниже: Я думаю, что намерение состоит в том, чтов двух synchronized
блоках AtomicBoolean
не может быть изменено, и если один поток находится в одном из synchronized
блоков, ни один другой такой блок не может быть введен.