1

したがって、Singleton クラスがあり、その中に複数のスレッドによって呼び出される非静的パブリック メソッドがあります。非静的メソッドでは、ストアド プロシージャによって作成されたオブジェクトへのローカル参照があります。これは、「new」キーワードがどこかで呼び出されることを意味すると推測しています。

 1 public void someMethod(SomeObjectParameter parameter) {
 2      
 3     Thing thingOne = synchornizedStoredProcedureCall(): 
 4     doSomethingWith(thingOne);
 5     doSomethingElseWith(thingOne);
 6
 7 }

現在、3 行目から 5 行目までは同期されたコード ブロックに含まれており、ストアド プロシージャの呼び出しを同期させるだけに減らしたいと考えています。

では... Thread1 と Thread2 の 2 つのスレッドがあるとします。Thread1 は行 3 を実行しようとしており、Thread2 は行 4 を実行しようとしています。これはローカル参照であるため、各スレッドは異なる参照を維持しますか、それとも doSomethingWith がそれを使用しようとしているときに、synchornizedStoredProcedureCall が thingOne への参照を上書きしますか?

thingOne が final と宣言された場合、またはそれを不変にした場合はどうなりますか?

4

6 に答える 6

4

各スレッドは異なる参照を維持しますか、それとも doSomethingWith がそれを使用しようとしているときに synchornizedStoredProcedureCall が thingOne への参照を上書きしますか?

異なるスレッドには異なるスタックがあります。はthingOneスレッドごとのスタックに格納されるため、他のスレッドによって上書きされることはありません。またはインスタンス変数ではなく、毎回synchornizedStoredProcedureCall()異なるインスタンスを返すことも確認する必要があります。両方のスレッドが異なるインスタンスで動作する必要があります。ThingstaticThing

doSomethingWith(...)とのdoSomethingElseWith(...)呼び出しがスレッド セーフであり、thingOne引数と定数 (など) でのみ機能する限り、 だけを保護しsynchornizedStoredProcedureCall()問題ありません。

@Marko が指摘しているように、Thingクラスを確認しないと、それがスレッドセーフであり、内部状態を保存しないことを保証できません。

于 2013-01-04T16:59:06.827 に答える
2

答えは、あなたが提示していない多くの詳細に依存します。クラスに関する多くの詳細がThing重要です。スレッドセーフではない内部共有状態が含まれる可能性があります ( Flyweightデザイン パターンを参照してください)。これらの事実はクラス Javadoc で文書化する必要があります。そうしないと、ソース コードからそれを見つけるのが非常に困難になります。

于 2013-01-04T17:04:10.970 に答える
0

あなたのthingOneはローカル変数です。スレッドセーフです。各スレッドは、ローカルの独自のコピーを取得します。

于 2013-01-04T17:02:14.060 に答える
0

Thingone は、スタック上でスレッドローカルとして宣言されているため、とにかくスレッド セーフです。thingone がメソッド内で宣言されていないインスタンス変数である場合、問題が発生します。しかし、そうではありません。

于 2013-01-04T16:58:55.377 に答える
0

thingOne共有されていないことを確認する必要があります。同期メソッドから返されたとしても、それが から返されたシングルトンのメンバーである場合synchornizedStoredProcedureCall、実装はもはやスレッド セーフではありません。

于 2013-01-04T17:09:26.560 に答える
0

各スレッドは異なる参照を維持します。someMethod が static の場合も同様です。

Thing インスタンスがスレッドセーフであることを確認する必要があります。たとえば、モノのクラスに静的フィールドがなく、2 つのモノのインスタンスに同じオブジェクトを指す非静的フィールドがないか、それらがスレッドセーフな方法でそれらを処理する場合です。

于 2013-01-04T17:14:02.417 に答える