2010-11-25 4 views
1

私はいつも、この特定のシナリオで永遠に心配していました。のは、私のクラスは、私の質問があり、このはクラスレベルのプロパティまたはスレッドセーフです

public class Person { 
public Address Address{get;set;} 
public string someMethod() 
{} 
} 

のように見えるとしましょう、私はタイプアドレスのアドレスproperyは、スレッドセーフではありませんことを、私の仲間の開発者によって言われました。 Web要求の観点から

は、すべての要求は、別のスレッドと スレッドが私のビジネスオブジェクトまたは背後にあるコードに次の行を処理するたびに、たとえば上で実行されて

var p = new Person(); 

それはの新しいインスタンスを作成します私のアプリケーションで複数のスレッドを生成しないかぎり、ヒープ上のPersonオブジェクトはインスタンスにアクセスします。

私が間違っている場合は、どうして私が間違っているのか、なぜパブリックプロパティ(アドレス)がスレッドセーフではないのかを説明してください。

ご協力いただければ幸いです。

ありがとうございました。

答えて

2

Personインスタンスへの参照が複数のスレッド間で共有されている場合、複数のスレッドが競合状態を引き起こす可能性があるAddressを変更する可能性があります。しかし、静的なフィールドやSession(グローバルにアクセス可能な場所)でその参照を保持しない限り、心配することはありません。

上記のようにコード内のオブジェクトへの参照を作成する場合(var p = new Person();)、他のスレッドは厄介な悪意のあるトリックに頼らずにこれらのオブジェクトへの参照にアクセスできないため、完全にスレッドセーフです。

+0

"静的フィールドまたはセッションでその参照を保持している場合を除いて"実際には、またはオブジェクトの同じインスタンスをワーカースレッドに渡しています。 –

+0

皆さんありがとうございます、本当に今はたくさんの意味があります。 –

1

あなたのプロパティはスレッドセーフではありません。なぜなら、それぞれのつま先でステップしているプロパティへの複数の書き込みを防ぐためのロックがないからです。

ただし、複数のスレッド間でクラスのインスタンスを共有していないシナリオでは、プロパティはスレッドセーフである必要はありません。各スレッドは、オブジェクトの状態を変化させることができる複数のスレッド間で共有され

オブジェクトは、すべての状態の変化は、一度に一つのスレッドがオブジェクトを変更できるように保護する必要があります。あなたはこれで問題ないはず

0

、しかし、私は心配したいことがいくつかあります...

あなたPersonオブジェクトが変更されたり、いくつかの使い捨てのリソースを開催することになった場合、あなたは潜在的の1つを見つけることができますスレッドはこの変数を読み取ることができません。これを防ぐには、オブジェクトを読み書きする前にオブジェクトをロックして、他のスレッドが踏み込まないようにする必要があります。最も簡単な方法はlock {}構造体を使うことです。

+0

皆さんありがとうございます、今は本当にたくさんの意味があります。 –

関連する問題