2009-04-27 6 views
1

私は最近、あなたが参照しているオブジェクトを単にロックする目的とロックする目的のためにセカンダリオブジェクトを使用することの違いを、スレッド化してプレイし始めた友人から頼まれました。誰も私に教えてもらえますか?私が試してみて、コードスニペットのカップルと実証します:指定されたオブジェクトのロックとセカンダリオブジェクトのロックの違いは何ですか?

最初の方法:

List<string> data = new List<string>(); 
object datalock = new object(); 

void main() 
{ 
    lock(datalock) 
    { 
     if (data.contains("SomeSearchString")) 
     { 
      //Do something with the data and then remove it 
     } 
    } 
} 

第二の方法:

List<string> data = new List<string>(); 

void main() 
{ 
    lock(data) 
    { 
     if (data.contains("SomeSearchString")) 
     { 
      //Do something with the data and then remove it 
     } 
    } 
} 

有意差があるか、これは個人的なコーディングスタイルにダウンしているのですか?重要な違いがある場合は、誰でもそれが何であるか説明できますか?

私は別の質問[Difference between lock(locker) and lock(variable_which_I_am_using)]に出くわしましたが、答えが両方とも同等であることが暗示されていましたが、その場合、使用するのがベストで、その理由は何ですか?

私は、ネットの周りに散在しているいくつかの例を見てきましたが、最初の方法を個人的な選択として使用する傾向がありましたが、2番目の方法を使用するメリットはどういうものかと思いました。

答えて

5

は大きな違いは、あなたのコードを約知っている二次オブジェクトとに対してロックコード(ないあなた)から予期しない結果(デッドロック、パルス/待つ落とし穴、など)のリスクがないということですプライマリオブジェクト(他のコードで共通に使用可能)。

IMO、おそらくCLRチームは、明示的なLockタイプで良く行われているだろう - または多分Monitorは非静的されている必要があります、など

+0

私はちょうどそれをタイプしていました... 私が追加しようとしていた唯一の事は、プライマリオブジェクトのロックは、スーパークラスのロック戦略に参加するために何をしているのかを知っているサブクラスが、しかし、彼らが何をしているのか分からない消費者が追加の問題を引き起こす危険性があります。 –

1

最も重要な点は、マルクでカバーされていますが、私は好みます最初のパターンは、読み書きロック用に個別のオブジェクトを持つスコープを開くか、または特定の用途に役立つその他の細かいレベルを開くためです。

+0

私は、ロックが解除されるのを待つのではなく、ロックが置かれている間も、ターゲットオブジェクトの子メソッドがまだアクセスできると思っています... – BenAlabaster

0

基本的には違いはありません。すべてのスレッドで安全でない操作が同じオブジェクトにロックされている場合、違いはありません。ただし、実装の観点からは違いがあります。他のスレッドが排他ロックが必要なオブジェクトにアクセスする必要がある場合は、その同期オブジェクトを使用可能にして、どのオブジェクトをロックする必要があるかを明確にする必要があります。

一方、ロックブロック内の別の値に実際に値を割り当てる場合があります。この場合、関係のないオブジェクトをロックする必要があります。

それがロックする別のオブジェクトを使用して、個人の好みや保守性(必要な第2のオブジェクト、悪い考え、またはどちらにロックしている?)

0

両方に降りてくるには、より多くの同期の粒度とパフォーマンスを可能にします。同じオブジェクトでロックしている場合は、1つの操作で不必要に別の操作をブロックしている可能性があります。 lock(this)を使用すると、すべての並行操作はロックを持つ操作が解放されるまで待機する必要があります。ただし、一部の操作が同じリソースにアクセスしていない可能性があるため、これは必要ではありません。だからあなたはそれらを不必要にロックしているため、パフォーマンスを傷つけています。代わりに、共有リソースのさまざまなグループに異なる同期オブジェクトを使用し、アクセスする必要があるリソースに対応するロックを操作で使用させます。

関連する問題