2016-05-27 14 views
4

以下のクラスでは、互いに全く関係のない2つの全く異なる方法を実行しています。しかし、私は両方のロックオブジェクトを1つだけ使用しています。クラス内に複数のロックオブジェクトを持つためのベストプラクティス

私の質問は、このようなシナリオではどのようなベストプラクティスですか?それぞれに2つの独立したロックオブジェクトを持っているか(ここでやっているように)?

class MyClass 
{ 

private static object _lock = new object(); 

public void DoSomething() 
{ 
    lock (_lock) 
    { 

    } 
} 

public void DoSomethingTotallyDifferent() 
{ 
    lock (_lock) 
    { 

    } 
} 
} 

答えて

4

質問です:DoSomethingまたはDoSomethingTotallyDifferentはお互いから呼び出すことができますか?その場合は、デッドロックを作成することができます。多分今はお互いに電話していないかもしれないが、将来的にはそうかもしれない。

私の2セント:申し訳ありませんよりも安全です。 2つの独立したロック変数を使用します。

+1

これに加えて、両方のメソッドが完全に別のものを実行しているので、絶対に必要ではない、 – Evk

+0

確かに。並行して走っている時にはそれも問題かもしれません。 @Evk –

+3

なぜ2つの別々のロック変数を使用する方が良いですか? Method1を呼び出すMethod1とMethod1を呼び出すMethod2がある場合(Thread1はMethod1で開始し、Thread2はMethod2で開始します)両方が異なるロックオブジェクトを持つ場合、デッドロックも発生します。私は正しい?しかし、ロックオブジェクトが1つしかない場合、メソッド2を実行する前に2番目のスレッドがMethod1の終了を待たなければならないため、デッドロックしないでください。 (2番目の手をとっている場合) –

4

ロックオブジェクトは、クラスではなくクリティカルリソース専用にする必要があります。

例えば、DoSomethingメソッドでクラスが重要リソースAを使用している場合は、_lockAオブジェクトが必要です。 DoSomethingTotallyDifferentがこのリソースにもアクセスする場合は、同じロックオブジェクトを使用する必要があります。他の重要なリソースBにアクセスする場合は、当然、対応するロックオブジェクト_lockBをロックする必要があります。これらのメソッドは、同じリソースを使用する必要がある場合にのみ邪魔になります。