JDV:
私は私に働いているアプリケーションでは、次のコードスニペットを見つけました:
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つのスレッドのいずれかであることながらsynchronized
、ブロック、どれも他のそのようなブロックを入力することができます。
ユージン:
ただ交換するsynchronized (this.atomicBoolean) {
両方の方法から一部を、AtomicBoolean::get
そしてAtomicBoolean::set
すでにアトミックです。