コードのスレッドセーフについては全体的にはかなり良いですが、それを処理する最善の方法では明確ではありません。Javaスレッドセーフティ:メソッドを呼び出すときにインスタンス変数を処理する方法
私は、囲んでいるクラスがその値を変更できるので、最終的なものではないインスタンス変数を持っています。この変数は、アプリケーション中に呼び出されるいくつかのメソッドを持つオブジェクトです。ここに、私が意味することを示すための簡単なサンプルがあります。
private class Foo{
private FooFoo fooFoo;
public synchronized void setFooFoo(FooFoo fooFoo){
this.fooFoo = fooFoo;
}
public void doSomething(){
fooFoo.doSomething(); //How do I make this line thread-safe?
}
}
fooFooフィールドの参照を変更するのは簡単ですが、単純な同期だけです。しかし、doSomething()メソッドがfooFooで呼び出されたときはどうですか?デッドロックのリスクのために私は常に外国人の方法で同期することを躊躇しています。
これは実際にはこれに基づいていますが、これにはさまざまなバリエーションがあります。私の会社のアプリケーションは、しばしばスパゲッティのボウルに似ている大規模なコードベースであるため、あらゆる種類の同期コードを書くことになると、私は余分な編集的です。米国では、東ヨーロッパのオフショア企業で働いており、私は彼らのすべてが良いコーディングの決定を下すとは信じていません。
このような状況をマルチスレッド環境で処理するベストプラクティスを探しています。ありがとう。
なぜそれが「デッドロックリスク」だと思いますか? –
なぜ、setFooFoo()で十分である場合、doSomething()メソッドのシンプルな同期がうまくいかないと思いますか?両方のメソッドにsynchronizedキーワードを設定している場合、ロックは同じオブジェクト上にあるため、デッドロックの可能性はありません。 – Vijay
3つのスレッドがある場合、スレッドAとスレッドBが同時に 'setFooFoo'を呼び出し、スレッド' C'が 'fooFoo.doSomething()'を呼び出す場合に何をしたいでしょうか?当時。シンクロナイズしなくても、このシナリオはクラッシュすることはありません。 – OldCurmudgeon