2011-02-24 8 views
6

私はクラス内のローカル変数(静的変数ではない)がロック内で使用されているこのコードを何度か紹介しました。ロック内の非静的ローカル変数を使用するポイントは何ですか?

public class SomeClass 
{ 
    private object obj = new object(); 
    .... 
    .... 
    lock(obj) 
    { 

    } 
} 

インスタンス変数があるとすれば、何らかのロックポイントがありますか?

+2

はい、特定のインスタンスのオブジェクトを同期する必要がある場合 – Stecya

+2

これは*ローカル変数*(単一のメソッドにローカル)ではなく*フィールド*または*インスタンス変数*です。 – Justin

+1

これが問題であると思われる理由を説明できますか? –

答えて

14

インスタンス変数があるとすれば、ロックポイントはありますか?

複数のスレッドが同じインスタンス上で動作している可能性があり、スレッドセーフティのためにロックが必要です。たとえば、共有キューを考えてみましょう。

+0

キューが共有されている場合、それを静的にするほうがよいでしょうか?私はちょうど私の心の中でこのユースケースを描写するのに苦労している。どのインスタンス変数もそのクラスインスタンスに対してローカルなので、このクラスをインスタンス化する複数のスレッドは、その異なるコピーを持ちます。私は何が欠けていますか? – imak

+0

@imak:タスクキューを考える( 'class TaskQueue')。今度はこの 'TaskQueue'の単一インスタンスを考えてみましょう。今、それが複数のスレッド(多分複数のプロデューサと複数の消費者)の間で共有されていると考えてください。キューのインスタンスは1つしかなく、すべてのインスタンス変数はさまざまなスレッド間で共有されます。このインスタンスを「スレッドセーフ」にするには、ロック用のインスタンス変数が必要です。 – jason

+2

@imak:Jasonの例を拡張する:2つのキューがあるとします。 Q1はスレッドAlphaとBravoで使用されます。 Q2はスレッドCharlieとDeltaで使用されます。なぜAlphaスレッドがQ1にアクセスすると、CharlieとDeltaは同時にQ2にアクセスできなくなるのですか?それはブラボー(とチャーリーとデルタ)がQ1にアクセスするのを防ぐはずですが、その間にチャーリーとデルタがQ2にアクセスすることを禁止する必要はありません。 –

5

静的ロックは、静的変数へのアクセスを制御するのに便利です。インスタンス変数は、インスタンス変数へのアクセスを制御するのに便利です。

ローカル変数を保護するためにローカルロックオブジェクトを使用している点(匿名関数のキャプチャされた外部変数またはイテレータでない限り)はありません。他のスレッドはどちらのロックにもアクセスできないためまたは変数。

+1

同じメソッドで定義された 'Action'や' Func'メソッドや匿名メソッドでアクセスされるローカル変数がない限り、 –

+0

@Jim Mischel - 固定、ありがとう! –

関連する問題