1

スレッド以下のobjの操作は安全ですか?メソッドレベルの変数とインスタンスが各スレッドのスタックに配置されることは知っていますが、ローカル変数がシングルトンの場合に何が起こるかはわかりません。foo()はWebサービス呼び出しで呼び出されます。これがスレッドセーフかどうか知りたいですか?

public void foo() {
    SomeObject obj = getSomeObject();  
    obj.doSomething();   // Would this be thread safe?
}

private SomeObject getSomeObject() {
    // returns singleton
    SpringContext.getBean("someObject");
}

class SomeObject {
    int x;
      ...

    // Not synchronized
    public void doSomething() {

    }
}
4

3 に答える 3

6

これは、「スレッドセーフ」の意味によって異なります。安全でない方法でインスタンスを変更した場合SomeObject.doSomething()、いいえ、安全ではありません。2つの異なるスレッドが、同じオブジェクトへの参照を取得する可能性があります。

基本的に、SomeObject複数のスレッドから同時に使用するように設計されていない限り、シングルトンにするべきではありません。

于 2012-09-05T18:22:06.363 に答える
4

SomeObject自体がスレッドセーフである場合にのみスレッドセーフです。たとえば、呼び出しで値を読み取って変更できる場合、x適切doSomething()にロックされていない限り、スレッドセーフではありません。

詳しく知らなければSomeObject、問題があるかどうかを正確に判断することは不可能です。

于 2012-09-05T18:21:22.963 に答える
0

静的参照を行うと、メソッド/スレッドの局所性が完全に失われる可能性があります。参照は静的であるため、静的参照を指すローカル フィールドはスレッド スタック上になく、実際には他のスレッドによって参照される可能性があります。

オブジェクトがスレッドローカルではなくグローバルに割り当てられた場合、同じスレッドセーフ効果があります。

final SomeObject obj = getSomeObject();
public void foo() {
    obj.doSomething();  
}

private SomeObject getSomeObject() {
    // returns singleton
    SpringContext.getBean("someObject");
}
于 2012-09-05T18:24:02.137 に答える