私が取り組んでいるアプリケーションで、次のコード スニペットを見つけました。
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
、オブジェクトをブロックすることを期待できないからです。
私の質問は次のとおりです。このメソッドを書き換える正しい方法は何ですか? 代わりにブール属性と一緒にロックオブジェクトを使用することについて読んだことがありますが、このロックに2つの新しい属性を導入するのはちょっと不器用に思えます。
編集: 以下のコメントに記載されているように: 意図は、2 つのsynchronized
ブロックではAtomicBoolean
変更できず、1 つのスレッドがブロックの 1 つにある間は、synchronized
他のそのようなブロックに入ることができないということだと思います。