2011-02-08 4 views
4

w3wp.exeは、Webアプリケーションの受信リクエストを処理するプロセスです(私が間違っている場合は修正してください)。クラスがある場合は、このようにCustomerに呼び出させますはクラスレベルのパブリックプロパティのスレッドセーフです

public class Customer 
{ 
    public string FirstName{get;set;} 
    public string LastName{get;set;} 
} 

だから今、このクラスは、プロパティ、姓と名へのアクセスを持ってw3wp.exeの中で実行中のインスタンスはヒープ内に作成されたこの

var customer = new Customer(); 

とすべてのスレッドのようなコードでアクセスされたとき顧客オブジェクトの

この場合、FirstNameプロパティとLastNameプロパティはスレッドセーフではありませんか?特定のインスタンスにのみ属し、スレッドセーフであるプライベートプロパティを使用することは常に賢明ですか?

+0

シナリオで2つのスレッドが同じ 'Customer'オブジェクトを保持することは可能ですか?たとえば、いくつかの共有状態または静的コンテナから? –

+0

Nope。このクラスはビジネスレイヤー上にあり、静的でも共有でもありません。 したがって、このクラスが要求の一部としてインスタンス化される場合、各インスタンス化は新しいスレッドで実行されるため、このシナリオのクラスレベルのpublicプロパティは静的リソースまたは共有リソースではないためスレッドセーフです。間違っていれば私を訂正してください。 –

+0

必ずしも "新しい"スレッドではなく、キャッシュされたスレッドである可能性が高いです。このキャッシュされたスレッドは、ASP.NETアプリケーション(HttpApplicationまたは "Global")のインスタンスを保持します。だから、このスレッドは、それがあらかじめ存在していたかもしれないどんなコンテキストも持っています。 –

答えて

3

コンパイラは自動プロパティのバッキングフィールドを作成しますが、コンパイラはそれに対して同期を作成しません。

スレッドの安全性に関しては、スレッド内でこのクラスのオブジェクトを使って何をしているかによって異なります。スレッドごとに異なるオブジェクトがある場合は問題ありません。

あなたがやっているすべての場合値を読んでから、それをを設定しない:あなたは多くのスレッドから同じオブジェクト(つまり、共有リソース)にアクセスしている場合

物事は少し異なっています複数のスレッド、問題はありません。

の場合、複数のスレッドのオブジェクトをに変更すると問題が発生することがあります。このにはが必要です。これはスレッド化されたコードで追加できるものです。

+1

あなたの答えはちょっと混乱していると思います。あなたが最後に言うことは正しいですが、OPが質問している文脈ではなく、それは関連性があるとは思わないのです。 –

-1

作業者プロセスの仕組みについての明確な概念はありません。基本的に、各スレッドに対して、クラスの新しいインスタンスが作成されます。したがって、クラスはスレッドセーフである必要はなく、実際にはスレッドセーフではありません。

プライベート/パブリックフィールドの理解とスレッドの安全性はまったく正しいとは限りません(私は信じません)。だからこの文脈では、あなたはそのように考えるべきではありません。

インスタンスはヒープ内に作成され、 で実行されている すべてのスレッドは、顧客 オブジェクトの 、姓と名のプロパティへのアクセス権を持っているのw3wp.exe。

いいえ、すべてのスレッドではありません。各スレッドはそれ自身のインスタンスを取得します。ここでは、ページやコントローラに顧客のインスタンスを作成したと仮定していますか?このように考えると、アプリケーションが受け取る各リクエストはスレッドであり、リクエストごとにページ(またはコントローラ)の新しいインスタンスが作成されるため、ページやコントローラで作成したオブジェクトもすべてそのスレッドに固有ですほとんどの場合、あなたは安全です。もちろん、あなたが言及していないことをしている場合や、ページやコントローラに顧客オブジェクトのインスタンスを作成していない場合は、答えを得る前に、あらゆる種類のその他の質問/シナリオを回答する必要があります。

私はどのようにこのすべての作品を説明する私のブログに投稿を書いています。投稿の目的は異なりますが、ここで学ぶ内容は、IISとWorkerの処理方法とASP.NETアプリケーションとのやりとりの仕方をよりよく理解するのに役立ちます。

ASP.NET Performance-Instantiating Business Layers

+1

これは、開発者が既存の共有ソースからオブジェクトを取得するかどうかによって大きく異なります。おそらくセッション/キャッシュ(メモリ内の場合)、または任意の静的コンテナ。実際にはかなり一般的です。この答えは、この可能性を完全に省略している点で、非常に誤解を招くものです。 –

+1

私は質問とそのブログ記事との間にもほとんど関係がありません。 –

+0

@Marc記事で私はIIS/Worker Processがスレッドをどのように作成し、キャッシュし、どのように「グローバル」に適用するのか、したがってASP.NETアプリケーションに適用する方法について話します。その部分は、OPの混乱にかなり関連しています。私は非常に複雑な状況を描き、基本的には「依存する」という質問にほとんど答えることができると確信しています。私はOPがIIS/ASP.NETのようなプログラミングやマルチスレッド環境の新機能であることが明らかであるため、単純にしています。マイクロソフトでは、ASP.NETでスレッドを認識しないように努力しました(少なくとも起動するときは)。 –

0

オデッドが指摘するように通常はokです。しかし、スレッドの問題を心配している場合は、コンパイラに裏付けフィールドを生成させないでください。ただし、接頭辞はvolatileです。アプリはそれに対してパフォーマンスのペナルティを支払うでしょう。

本当にスレッディングが心配な場合は、割り当て時にthis methodを使用して手動でインターロックすることができます。

私が見てきたベストプラクティスは、マルチスレッドコンテキストのapperasであるコード内の変数のプレフィックス+ volatileのプレフィックスを使用しています。このテクニックを使用しても問題はありませんでした。

+2

申し訳ありませんが、なぜあなたは 'volatile'と' lock'を両方とも使いたいのですか?また、感情(「本当に心配している場合」)がマルチスレッドプログラミングを導く場合は、おそらくあなたの理解に大きなギャップがあります。 –

+0

http://www.albahari.com/threading/ –

+0

ロックで保護すると、「揮発性」は偽りです。あなたはそれを知らないのですか?そうでなければ、ギャップがあります。もしそうなら、私はあなたの答えを理解できません。いずれにせよ、問題がある! –

関連する問題