Синхронизация на AtomicBoolean? - PullRequest
       26

Синхронизация на AtomicBoolean?

2 голосов
/ 04 апреля 2019

В приложении, над которым я работаю, я нашел следующий фрагмент кода:

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 блоков, ни один другой такой блок не может быть введен.

Ответы [ 2 ]

8 голосов
/ 04 апреля 2019

просто замените часть synchronized (this.atomicBoolean) { обоих методов, AtomicBoolean::get и AtomicBoolean::set уже атомарны.

1 голос
/ 04 апреля 2019

... Я не могу использовать AtomicBoolean вместе с синхронизированным ...

Для чего бы то ни было, язык позволяет синхронизировать на любой object.

По стилю, некоторые программисты предпочитают синхронизироваться только с закрытым объектом, который не используется ни для каких других целей.

private static Object foobarLock = new Object();
...
public void fooItUp(...) {
    ...
    synchronized(foobarLock) {
        ...
    }
    ...
}

... и ожидаем этогозаблокировать объект

Просто для ясности, когда какой-то поток T входит в блок synchronized (o) {...}, который не не позволяет другим потокам получить доступ или изменить объект o,Единственное, что он предотвращает, это то, что он не позволяет другому потоку U одновременно входить в синхронизированный блок на том же объекте o.

...