2012-02-09 5 views
2

スレッド:入力パラメータを返すの悪い習慣を無視静的インスタンスは、私は以下のような戦略パターンの実装を持って安全

​​

、安全な静的インスタンスインスタンス使用糸のですか?

+3

ところで、誰もコンクリートストラテジーの別のインスタンスを作成していないことを知っているので、プライベートコンストラクタを追加してください。(希望の動作の場合には:) – helios

+0

そしてあなたがそれについて話している間にクラスをfinalにしてください。 –

答えて

2

と仮定すると、ConcreteStrategyは変更されていないか、スレッドセーフな方法でのみ変更されます。 final修飾子は、(Java 1.5以降では)すべてのスレッドが少なくともクラスが初期化されたときの状態のINSTANCEオブジェクトを確認するようにします。その後のオブジェクトへの変更は通常の方法(スレッドの安全性を提供する揮発性物質、同期、クラスなど)によってスレッドセーフにする必要があります。

+0

私が間違っていれば私を修正してください。関数を呼び出すと、オブジェクト参照コピーがメソッドに渡されるため、メソッドが別のオブジェクトで実行されるたびにそのメソッドが渡されます。 クラスはWebアプリケーションで使用されますが、呼び出しはコードのみを共有しますか? – landal79

+1

@ landal79:Javaは参照のコピーを渡します。だから "aClass" paramは参照のコピーです。しかし、使用され返されるAClassオブジェクトは同じです。それをポインタと考える。あなたはポインタ、ポインタのコピーなどを渡すことができますが、尖ったオブジェクトは同じです。もし1つの 'new'があれば、1つのオブジェクトがあります。 – helios

+0

新しいJMMの「最終フィールドの意味」はここでは無関係です。すべてのスレッドは、静的な初期化子が本当にばかげた何かをしない限り、完全に初期化された 'ConcreteStrategy'クラスを見ます。 –

1

一般に、Javaでは、不変またはステートレスのオブジェクトはすべてスレッドセーフです。

例はです。スレッドセーフです。

への参照は、最終的なのでスレッドセーフです。しかし、ConcreteStrategyの内容はスレッドセーフではないかもしれません(コードは表示されないので、わかりません)。

をConcreteStrategyオブジェクトに適切に同期させると、スレッドセーフなオブジェクトになる可能性があります。

乾杯、ユージン。

+0

'execute()'メソッドがパラメータ – landal79

+0

@ landal79上でのみ実行されたとします。あなたが意味することを理解できませんでした。もう少し冗長なPLZにできますか? – Eugene

+0

'execute()'メソッドは 'aClass'インスタンスフィールド値に対して何らかの評価を行い、ConcreteStrategyクラスは内部状態を持たず、アルゴリズムのみです。 – landal79

関連する問題